您现在的位置是:首页 > 文章详情

Spring 7大事务传播模型

日期:2018-10-07点击:302

REQUIRED

 /** * Support a current transaction, create a new one if none exists. * Analogous to EJB transaction attribute of the same name. * <p>This is the default setting of a transaction annotation. */

必须有一个事务,如果当前已存在则用当前的,如果不存在则新建一个事务
1

SUPPORTS

 /** * Support a current transaction, execute non-transactionally if none exists. * Analogous to EJB transaction attribute of the same name. * <p>Note: For transaction managers with transaction synchronization, * PROPAGATION_SUPPORTS is slightly different from no transaction at all, * as it defines a transaction scope that synchronization will apply for. * As a consequence, the same resources (JDBC Connection, Hibernate Session, etc) * will be shared for the entire specified scope. Note that this depends on * the actual synchronization configuration of the transaction manager. * @see org.springframework.transaction.support.AbstractPlatformTransactionManager#setTransactionSynchronization */

使用当前事物,如果当前则以无事务模式运行

MANDATORY

 /** * Support a current transaction, throw an exception if none exists. * Analogous to EJB transaction attribute of the same name. */

表示强制需要一个事务,如果不存事务则抛出异常

REQUIRES_NEW

 /** * Create a new transaction, and suspend the current transaction if one exists. * Analogous to the EJB transaction attribute of the same name. * <p><b>NOTE:</b> Actual transaction suspension will not work out-of-the-box * on all transaction managers. This in particular applies to * {@link org.springframework.transaction.jta.JtaTransactionManager}, * which requires the {@code javax.transaction.TransactionManager} to be * made available it to it (which is server-specific in standard Java EE). * @see org.springframework.transaction.jta.JtaTransactionManager#setTransactionManager */

每次都创建一个新的事务,如果当前存在事务则挂起当前事务运行新事务,两个事务互相独立,新事物回滚也不会影响外部事务
2

NOT_SUPPORTED

 /** * Execute non-transactionally, suspend the current transaction if one exists. * Analogous to EJB transaction attribute of the same name. * <p><b>NOTE:</b> Actual transaction suspension will not work out-of-the-box * on all transaction managers. This in particular applies to * {@link org.springframework.transaction.jta.JtaTransactionManager}, * which requires the {@code javax.transaction.TransactionManager} to be * made available it to it (which is server-specific in standard Java EE). * @see org.springframework.transaction.jta.JtaTransactionManager#setTransactionManager */

已非事务模式运行,如果当前存在事务则挂起当前事务

NEVER

 /** * Execute non-transactionally, throw an exception if a transaction exists. * Analogous to EJB transaction attribute of the same name. */

从不需要事务,如果当前存在事务则抛出异常,刚好与 MANDATORY 相反

NESTED

 /** * Execute within a nested transaction if a current transaction exists, * behave like PROPAGATION_REQUIRED else. There is no analogous feature in EJB. * <p>Note: Actual creation of a nested transaction will only work on specific * transaction managers. Out of the box, this only applies to the JDBC * DataSourceTransactionManager when working on a JDBC 3.0 driver. * Some JTA providers might support nested transactions as well. * @see org.springframework.jdbc.datasource.DataSourceTransactionManager */

嵌入式事务模式,与PROPAGATION_REQUIRED相似,如果没有就新建,如果有适用当前事务,但是NESTED具体当前事务多个保存点,可以部分回滚。仅适用于JDBC事务管理,内部可以独立回滚并且不影响外部。

原文链接:https://yq.aliyun.com/articles/648306
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章