1

我在 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。这将我引向 SpringsJtaTransactionManagerdoRollBack(..).

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

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

4

2 回答 2

3

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

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

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

于 2011-06-21T11:49:43.307 回答
1

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

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

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

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

于 2011-06-23T08:02:46.710 回答