java在spring中是否需要事务属性?
在http://www.vermatech.com/code/SpringTransactionExamples.html给出的第一个案例研究中, 程序正在调用两个方法,即
testModel.deleteAllCountries();
testModel.initializeCountries();
其中initializeCountries引发运行时异常。对于这两种方法,都需要“事务定义”属性。仍在删除所有国家/地区下进行交易 方法被提交,但initializeCountries下的事务被回滚(根据同一案例研究中给出的日志)
根据您的要求,定义为支持当前事务;如果不存在,则创建一个新的。所以我这里的问题是initializeCountries方法下的事务 应支持deleteAllCountries方法下的事务。我的意思是,这两种方法都应该被视为单一交易。根据我的理解,是否应该提交或回滚完整的事务?不知道为什么日志会单独处理它们
# 1 楼答案
“需要传播”定义为
在上面的例子中,deleteAllCountries方法在事务中执行并提交。调用initializeCountries时没有当前事务,因此它在第二个事务中执行,回滚它对第一个方法所做的更改没有影响
传播适用于嵌套的方法调用,而不是连续的方法调用。如果你看一下the documentation:
然后你可以看到所有这些都是关于内部和外部的,没有一个提到连续的调用。在您的例子中,对deleteAllCountries的调用是最外层的事务方法,因此当它成功完成时,Spring会立即提交事务。然后,对initializeCountries的调用必须在单独的事务中执行,其中它是最外层的方法
您的假设似乎是Spring将在第一个方法完成后保持事务打开,但它不是这样工作的。为了获得想要的效果,您可以在testModel上创建另一个方法,该方法包装对deleteAllCountries和initializeCountries的调用,使该方法具有事务性,并为其提供所需的属性。这样,第二个方法的回滚将导致第一个方法的更改也被回滚,因为包装方法将它们分组在一起。否则,没有任何东西告诉Spring这些东西应该是同一事务的一部分