Spring注释事务管理

时间:2012-12-30 12:02:07

标签: spring hibernate transactions annotations

我有一个春天& Hibernate Web应用程序,我将连接到两个数据库。

web.xml中,我已将应用程序上下文文件的路径配置为以下

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

我在config目录下有三个文件

  • 1- primary-hibernateContext.xml
  • 2- secondary-hibernateContext.xml
  • 3- root-context.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 context 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&amp; @Transactional(value="secondary_transactionManager", readOnly=true, rollbackFor=Exception.class)

我有一个控制器,其中服务是自动装配的。

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

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

所以,我认为交易配置不好。

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我已经意识到我使用错误的事务管理器对服务进行了注释,这导致了之前的奇怪行为

该服务(我正在使用)用

注释

@Transactional(值= 'transaction_manger_1')

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

所以我已经将事务管理器更改为正确的事务管理器,并且每件事情都很顺利。