2011-06-21 139 views
1

我有mybatis 3.0.4和mybatis-spring集成1.0.1部署在Fuse(OSGi)中。我在SQLServer 2008中创建了一个基本数据库。在Spring中,我配置了一个TransactionAwareDataSourceProxy数据源和一个DataSourceTransactionManager事务管理器。交易没有回滚

现在我创建了自己的包,用于在Fuse中插入一些行到数据库中。我已经告诉捆绑使用配置的数据源和事务管理器。执行逻辑的方法如下所示:

@Transactional(propagation=Propagation.REQUIRED) 
public void go(RecsCashContext context) throws ActionException { 

当此方法引发异常时,我可以通过查看触发的预期行为来遵循Spring。这导致我弹簧JtaTransactionManagerdoRollBack(..)

所以一切都看起来很有希望,除了当我看着数据库,当然它处于不稳定的状态,因为以前的插入没有回滚。

我对此感到茫然,我很难在网上找到任何信息。有什么想法吗?

回答

1

事实证明Fuse(servicemix)已经通过OSGi服务在包org.apache.aries.transaction.manager_0.2.0.incubating [49]中公开了一个事务管理器。因此,当我查找事务管理器服务时,由捆绑包49暴露的那个服务首先被拾起。

这是通过明确规定的交易经理,我感兴趣的是解决目前我使用的是豆名字属性格式这样做:

<osgi:reference id="transactionManager" bean-name="transactionManager" interface="org.springframework.transaction.PlatformTransactionManager" /> 

虽然这也可以通过使用过滤器来完成,但最好我们只是利用已经公开的事务管理器服务,而不是提供我们自己的服务。

3

抛出什么样的异常?除非您告诉Spring在抛出特定异常时显式回滚,否则它将继续。默认情况下,Spring的事务处理只会在引发未经检查的异常(例如RuntimeException)时回滚。在你的情况,如果你希望回滚时ActionException时发生,你的运气,除非你做如下修改:

@Transactional(rollbackFor={ActionException.class}) 
public void go(RecsCashContext context) throws ActionException { 

更多细节在here,特别是在第10.5.6.1, @Transactional设置

+0

在这种情况下,我实际上是为了测试事务性强制运行时异常。正如我所提到的,我能够通过Spring源代码看到它声称回滚是有效的。 – AndyF

+0

所有的持久性工作都是在go(...)方法中完成的,还是有一些插入是在另一种使用不同传播规则的方法中完成的? – Fil

+0

所有在同一个......我的担心是,也许mybatis正在为它传播的每个插入创建新的事务 - 虽然我可以看到它为什么会这样做。 – AndyF