2012-12-30 133 views
0

我有一个Spring & Hibernate Web应用程序,我将连接到两个数据库。Spring注释事务管理

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

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

在那里我有config目录下三个文件

  • 1-初级hibernateContext.xml
  • 2- secondary-hibernateContext.xml
  • 3- root-context.xml

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

我确实在第二个文件

在第三文件中的相同的I所配置的部件扫描和交易注释配置如下

<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作为以下

0123一个servlet上下文xml文件
<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日志并检查了三个保存语句,并且我发现这些语句并未在事务中执行。我意识到,因为我没有在insert语句之前和之后发现SET AUTOCOMMIT语句。

所以,我认为事务配置不好。

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

+0

你是否假设3d方法会回滚前两种方法的动作? –

+0

你的休眠配置是什么? –

回答

0

我已经意识到我标注了错误的事务管理服务,这是什么导致了以前的奇怪的行为

服务(我使用)与

@Transactional(值注释=” transaction_manger_1')

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

所以我已经改变了交易经理到正确的一个,每一件事情都很好。

0

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