java - Spring事务边界扩展

标签 java spring transactions

我有一系列方法调用,其中 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/

相关文章:

java - 格式化数字字符串

java - args 中不存在参数

java - Spring ClientHttpRequestInterceptor请求/响应为空

spring - 在声明式事务管理中,无论事务是提交还是回滚,如何在 Spring 中获取事务信息?

java - 多战耳发现预绑定(bind) JDBC 连接

java - 从文本文件中读取整数并将其放入二维数组中 (Java)

java - 为什么我收到意外 token 错误

spring - 无法执行目标 org.springframework.boot :spring-boot-. 。 :2. 1.8。运行时发生异常。无效的

php - 事务无法在 codeigniter 中回滚

java - 使用 Java 的 PC 到 PC 通信