【问题标题】:Spring - Transaction not being applied around methodSpring - 未在方法周围应用事务
【发布时间】:2017-01-21 12:03:03
【问题描述】:

我正在尝试围绕我的应用程序中的一个方法使用声明性事务,该方法会进行多个数据库调用。我通过将@Transactional 注释应用到有问题的方法来做到这一点,它看起来类似于这样:

@Transactional
public MyReturnType myTransactionalMethod(SomeType1 param) {
    SomeType2 someIntermediateObject = dao1.doStuff(param);
    MyReturnType retObj = dao2.doMoreStuff(someIntermediateObject);
    return retObj;
}

然后我在我的 XML 配置中设置 Spring Transactions:

<tx:annotation-driven transaction-manager="transactionManager" order="200"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
      p:dataSource-ref="dataSource"/>

然后我想测试该方法以验证事务是否会在方法失败时正确回滚,因此我将方法修改为如下所示:

public MyReturnType myTransactionalMethod(SomeType1 param) {
    SomeType2 someIntermediateObject = dao1.doStuff(param);
    MyReturnType retObj = dao2.doMoreStuff(someIntermediateObject);
    throw new RuntimeException(); //The RuntimeException should trigger a rollback
}

当我执行第二种方法时,它并没有像我预期的那样进行回滚,而是将创建的条目留在了我的数据库中。我还期望在堆栈跟踪中看到一些迹象表明插入的方法周围的弹簧方面挂钩可以处理事务性内容,但我只看到此事务性方法之前的调用方法,没有任何 Spring 注入方法的迹象.

任何人都可以看到我做错的任何事情会导致未应用事务处理的这种行为吗?

【问题讨论】:

  • 显示您的呼叫地址myTransactionalMethod

标签: java spring transactions


【解决方案1】:

这种行为是因为您正在使用 DataSourceTransactionManager,此 txManager 用于 JDBC 事务。例如,如果您在数据库中插入某些内容并且失败,它将回滚此事务。如果您尝试插入比允许的更长的值,则 tx 可能会失败。请注意,数据源知道失败。

在您的示例中,DataSource 不知道失败,因为您正在抛出异常。对于这些情况,您可以使用 JtaTransactionManager,但您的容器必须支持 JTA 事务。或者,您可以在数据库中尝试插入一些过长的值或不同类型的值或非空列中的空值。

你可以在这里看到更多:

http://www.journaldev.com/2603/spring-transaction-management-jdbc-example

http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    相关资源
    最近更新 更多