【问题标题】:Transaction not rolling back事务不回滚
【发布时间】:2011-09-19 10:57:33
【问题描述】:

我在 Fuse (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(..)。

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

我对此一无所知,并且正在努力在网上查找任何信息。有什么想法吗?

【问题讨论】:

    标签: spring sql-server-2008 transactions mybatis fuseesb


    【解决方案1】:

    抛出了什么样的异常?除非您告诉 Spring 在抛出特定异常时显式回滚,否则它将继续。默认情况下,Spring 的事务处理仅在抛出未经检查的异常(例如 RuntimeException)时回滚。在您的情况下,如果您希望在发生 ActionException 时发生回滚,那么除非您进行以下修改,否则您就不走运了:

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

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

    【讨论】:

    • 在这种情况下,我实际上是为了测试事务性而强制运行时异常。正如我所提到的,我可以通过 Spring 源代码查看它断言回滚是有效的。
    • 您的所有持久性工作是在 go(...) 方法中完成的,还是在其他具有不同传播规则的方法中完成一些插入?
    • 都一样...我担心的是 mybatis 可能会为它传播的每个插入创建新的事务——尽管我知道它为什么会这样做。
    • 您是否尝试过使用不同的事务管理器?你说你正在使用 JtaTransactionManager;也许试试 DatasourceTransactionManager? static.springsource.org/spring/docs/3.0.x/api/org/…
    • 感谢您的意见 Filip,我现在已经确定了这个问题,如下所述。
    【解决方案2】:

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

    通过明确指定我感兴趣的事务管理器解决了这个问题。目前我正在使用 bean-name 属性进行此操作:

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-13
      • 2013-12-15
      • 2011-01-26
      • 2017-03-03
      • 2012-03-10
      • 1970-01-01
      • 2018-07-15
      • 2015-10-25
      相关资源
      最近更新 更多