0

我有一个 Spring & Hibernate Web 应用程序,我将在其中连接到两个数据库。

web.xml我已经配置了应用程序上下文文件的路径如下

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
            classpath:config/*.xml
    </param-value>
</context-param>

我在 config 目录下有三个文件

  • 1-主要的hibernateContext.xml
  • 2-二级hibernateContext.xml
  • 3-根上下文.xml

在第一个文件中,我配置了主数据源、会话工厂和事务管理器(primary_manager)

我在第二个文件中做了同样的事情

在第三个文件中,我配置了组件扫描和事务注释配置如下

<tx:annotation-driven/>
<!-- Enable Spring annotation configuration -->
<context:annotation-config />
<!-- Scan the application for all possible Services & autowire -->
<context:component-scan base-package="net.mr2.*.service" />
<context:component-scan base-package="net.mr2.*.dao" />

我有一个 servlet 上下文 xml 文件,我在其中配置了调度程序 servlet,如下所示

<annotation-driven />
<context:component-scan base-package="net.mr2.*.web" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

服务类带有注释@service& @Transactional(value="secondary_transactionManager", readOnly=true, rollbackFor=Exception.class)

我有一个自动连接服务的控制器。

我从控制器调用服务类中的三个方法(save1()save2()save3())。我在第三种方法中抛出异常,我假设第三种方法应该回滚,但这不会发生。

我打开了mysql的日志,检查了三个保存语句,发现语句没有在事务中执行。我意识到,因为我没有SET AUTOCOMMIT在插入语句之前和之后找到语句。

所以,我假设事务没有配置好。

我的设置会出现什么问题?

4

2 回答 2

0

您配置了应用程序,以便它为每次调用服务(即事务类)打开一个新事务。您需要在控制器中启动事务或将调用包装在服务级别的另一个方法中。

于 2012-12-30T18:39:31.587 回答
0

我意识到我用错误的事务管理器注释了服务,这导致了以前的奇怪行为

服务(我正在使用)被注释

@transactional(value='transaction_manger_1')

此事务管理器配置为与 read_only DB 一起使用,而注入的 DAO 正在使用与读/写 DB 一起使用的正确会话工厂。

因此,我已将事务管理器更改为正确的,并且一切正常。

于 2013-01-08T11:34:45.820 回答