如何在春季交易中选择PROPAGATION?

时间:2016-10-21 08:16:19

标签: spring transactions mybatis spring-mybatis propagation

我刚刚阅读了spring-mybatis.xml,这里有一些事务管理器代码:

enter image description here

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

1 个答案:

答案 0 :(得分:0)

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

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

1)Spring支持两种类型的事务管理:
程序化事务管理:这意味着您可以在编程的帮助下管理事务。这为您提供了极大的灵活性,但很难维护。

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

2)春季交易定义
PROPAGATION_REQUIRED:     Spring REQUIRED行为意味着如果当前bean方法执行上下文中已经打开的事务,将使用相同的事务。如果不存在,则创建一个新的。     简而言之,这意味着如果内部(第二个事务)方法导致事务回滚,则外部(第一个事务)方法将无法提交并且还将回滚事务。
PROPAGATION_SUPPORTS: 支持当前交易;如果不存在则执行非事务性。

理解这些“请求”“支持”是不够的,正如我提到的那样,您需要了解org.springframework.transaction.TransactionDefinition类下的所有Spring定义。

不幸的是,我对2014年12月在slideshare网站上写的Spring类型和交易有一个强烈的观点。 Spring Transaction Management

在这张幻灯片中,我在power point note会话中添加了关于Spring事务的非常重要的观点。因此,请不仅参考幻灯片内容,还请参阅幻灯片说明会话。希望它有所帮助。

示例,也可以参考power point notes会话,以便更好地了解Spring事务定义。 enter image description here

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