我在myse(OSGi)中部署了mybatis-spring集成1.0.1的mybatis 3.0.4。我在SQLServer 2008中创建了一个基本数据库。在Spring中,我配置了TransactionAwareDataSourceProxy
数据源和DataSourceTransactionManager
事务管理器。
现在我已经创建了自己的包,要在Fuse中部署,它会在数据库中插入一些行。我告诉捆绑包使用配置的数据源和事务管理器。执行逻辑的方法如下:
@Transactional(propagation=Propagation.REQUIRED)
public void go(RecsCashContext context) throws ActionException {
当此方法抛出异常时,我可以通过查看触发的预期行为来关注Spring。这会将我带到Springs JtaTransactionManager
和doRollBack(..)
。
所以一切看起来很有希望,除了当我查看数据库时,确定它处于不稳定状态,因为以前的插入没有被回滚。
我对此感到茫然,我很难在网上找到任何信息。有什么想法吗?
答案 0 :(得分:3)
抛出什么样的异常?除非你告诉Spring在抛出特定异常时显式回滚,否则它将继续。默认情况下,Spring的事务处理仅在抛出未经检查的异常(例如RuntimeException)时回滚。在您的情况下,如果您希望在发生ActionException时发生回滚,那么除非您进行以下修改,否则您将失去运气:
@Transactional(rollbackFor={ActionException.class})
public void go(RecsCashContext context) throws ActionException {
更多详细信息位于here,特别是第10.5.6.1节,@事务处理设置
答案 1 :(得分:1)
事实证明,Fuse(servicemix)已经通过bundle org.apache.aries.transaction.manager_0.2.0.incubating [49]
中的OSGi服务公开了一个事务管理器。因此,当我查找事务管理器服务时,由bundle 49暴露的那个服务首先被提取。
通过明确指定我感兴趣的事务管理器解决了这个问题。目前我正在使用bean-name propery执行此操作:
<osgi:reference id="transactionManager" bean-name="transactionManager" interface="org.springframework.transaction.PlatformTransactionManager" />
虽然这也可以通过使用过滤器来完成,但最好我们只使用已经公开的事务管理器服务而不是提供我们自己的事务。