如何在 spring 事务中 select 传播?

How to select PROPAGATION in spring transaction?

我正在阅读 spring-mybatis.xml,这里是 transaction-manager 的一些代码:

我想知道为什么有些方法定义为"REQUIRED"或"SUPPORTS"?如何思考并决定选择哪个?

你的问题是,我认为这是关于 Spring 事务的,它取决于你的业务逻辑以及你如何控制 spring 事务。

要了解 Spring 交易 "REQUIRED" 或 "SUPPORTS",您需要了解 spring 交易定义。此事务定义类型来自 org.springframework.transaction.TransactionDefinition class。但首先您需要了解 1)Spring 交易类型,然后 2)Spring 交易定义。

1)Spring支持两种事务管理:
程序化事务管理:这意味着您已经借助编程来管理事务。这为您提供了极大的灵活性,但很难维护。

声明式事务管理: 这意味着您将事务管理与业务代码分开。您仅使用注释或基于 XML 的配置来管理事务。

2) Spring 事务定义
PROPAGATION_REQUIRED: Spring REQUIRED 行为意味着如果在当前 bean 方法执行上下文中有一个已经打开的事务,则将使用相同的事务。如果 none 存在,则创建一个新的。 简而言之,这意味着如果 inner(2nd Transaction) 方法导致事务回滚,则 outer(1st Transaction) 方法将无法提交并且也会回滚事务。
PROPAGATION_SUPPORTS: 支持当前交易;如果 none 存在,则以非事务方式执行。

了解这些 "REQUIRE" "SUPPORTS" 是不够的,正如我向您提到的,您需要了解 org.springframework.transaction.TransactionDefinition class 下的所有 Spring 定义。

不幸的是,我在 2014 年 12 月在 slideshare 网站上写了一篇关于这种 Spring 类型和交易的简报。 Spring Transaction Management

在这张幻灯片中,我在 PowerPoint 笔记会话中添加了关于 Spring 交易的非常重要的一点。因此,请不仅参考幻灯片内容,还参考幻灯片注释会话。希望对你有帮助。

示例,也可参考 power point notes session 以进一步了解 Spring 事务定义。

已编辑:
传播方式: 通常,在事务范围内执行的所有代码都将在该事务中 运行。但是,您可以选择指定在事务上下文已存在时执行事务方法时的行为。例如,代码可以在现有事务中继续 运行ning(常见情况);或者可以暂停现有事务并创建新事务。 Spring 提供了 EJB CMT 熟悉的所有事务传播选项。要了解 Spring 中事务传播的语义,请参阅 Transaction Propagation