春季注释交易操作



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

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

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

我在配置目录下有三个文件

  • 1-主要hibernatecontext.xml
  • 2-次级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上下文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日志并检查了三个保存语句,我发现该语句在事务中未执行。我意识到,由于我在插入语句之前和之后找不到SET AUTOCOMMIT语句。

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

我的设置中有什么问题?

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

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

注释服务(我正在使用)

@transactional(value ='transaction_manger_1')

此事务管理器配置为与Read_Only DB一起使用,而DAO使用的是正确的会话工厂,该工厂可与Read/Write DB一起使用。

所以我将交易管理器更改为正确的一件,每件事都很好。

最新更新