我有一系列方法调用,其中 A 调用 B,B 调用 C,C 调用 D。A 和 D 有 @Transactional 注释。但 B 和 C 没有。在这种情况下,事务边界的范围是多少? B 和 C 到底是交易的一部分吗?
最佳答案
默认情况下,A、B、C 和 D 在同一事务中工作。事务的默认传播级别是 TX_REQUIRED,这意味着如果事务不存在,则启动新事务(A 启动一个,B、C、D 参与)。
D 可以通过将其传播级别设置为 TX_REQUIRES_NEW 来启动新事务(如果您的环境支持)。在这种情况下,当 D 完成时,暂停的事务将恢复。提交 D 不会影响事务 A 的结果。回滚 A 不会回滚 D(已提交),因为它们是单独的事务。
此外,许多开发人员忘记了只有公共(public)方法可以被标记为 @Transactional,因为 Spring 使用代理来管理事务(私有(private)/ protected 方法在“this”上调用 - 因此代理没有机会发挥其魔力) 。如果您使用字节代码注入(inject)而不是代理,则这不一定成立。
如果您想了解有关事务设计模式的更多信息,我强烈建议您阅读以下电子书(免费! - 需要注册):http://www.infoq.com/minibooks/JTDS 。读起来非常简单。
关于java - Spring事务边界扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6046467/