Spring事务边界扩展

mei*_*sam 2 java spring transactions

我有一系列方法调用,其中A调用B调用C调用D.A和D有@Transactional注释.但B和C没有.在这种情况下,事务边界的范围是什么.B和C是交易的一部分吗?

Pat*_*eur 5

默认情况下,A,B,C&D在同一事务中工作.事务的默认传播级别为TX_REQUIRED,这意味着如果不存在新事务,则启动新事务(A启动一个,B,C,D参与).

D可以通过将其传播级别设置为TX_REQUIRES_NEW(如果您的环境支持它)来启动新事务.在那种情况下,当D完成时,恢复暂停的事务.提交D不会影响事务A的结果.回滚A不会回滚D(已提交),因为它们是单独的事务.

此外,许多开发人员忘记了只有公共方法可能被标记为@Transactional,因为Spring使用代理来管理事务(私有/受保护的方法在"this"上调用 - 因此代理没有机会发挥其魔力).如果您使用字节代码注入而不是代理,则这不一定成立.

如果您想了解有关交易设计模式的更多信息,我强烈建议您使用以下电子书(免费! - 需要注册):http://www.infoq.com/minibooks/JTDS.这是一个非常简单的阅读.