Spring @Transactional注解事务传播机制propagation参数说明

这篇具有很好参考价值的文章主要介绍了Spring @Transactional注解事务传播机制propagation参数说明。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说明

在SpringBoot项目中,我们通常使用@Transactional 去进行事务控制,而@Transactional 注解中,有个比较关键的属性就是propagation。在一个多事务的环境中,一个事务方法调用另一个事务方法时,就会涉及到事务的传播行为,该属性用来控制一段代码经过多个@Transactional注解生效(同一个类的不同方法调用@Transactional是不会生效的)的方法的事务传播机制。

对应源码:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
	/**
	 * The transaction propagation type.
	 * <p>Defaults to {@link Propagation#REQUIRED}.
	 * @see org.springframework.transaction.interceptor.TransactionAttribute#getPropagationBehavior()
	 */
	Propagation propagation() default Propagation.REQUIRED;
}

由源码可知,他是用来指定@Transactional事务传播类型,在不指定的情况下,默认值为Propagation.REQUIRED

而查看Propagation可知,一共有以下7个属性。

/**
 * Enumeration that represents transaction propagation behaviors for use
 * with the {@link Transactional} annotation, corresponding to the
 * {@link TransactionDefinition} interface.
 */
public enum Propagation {
	REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED),

	SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS),

	MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY),

	REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW),

	NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED),

	NEVER(TransactionDefinition.PROPAGATION_NEVER),

	NESTED(TransactionDefinition.PROPAGATION_NESTED);
}

每个属性的作用

1.REQUIRED:

默认的传播行为,如果当前存在事务,则加入到当前事务中,如果没有事务,则创建一个新的事务。

这是最常用的选项,适用于大多数业务情况。

2.REQUIRES_NEW

每次都会创建一个新的事务,如果当前存在事务,则将其挂起。这样,每个方法都在自己的事务中运行,互相独立。

使用场景:多个用户同时请求分配某些共享资源,如飞机座位、酒店房间等。你可能希望每个用户的分配操作都在独立的事务中进行,以避免资源冲突问题。使用 REQUIRES_NEW 隔离级别可以确保每个用户的资源分配操作都是独立的,不受其他用户的操作干扰。

3.SUPPORTS

如果当前存在事务,则加入到当前事务中,如果没有事务,则以非事务方式执行。这个选项适用于不需要强制要求事务的方法,可以根据上下文自由选择是否使用事务。

4.NOT_SUPPORTED

以非事务方式执行方法,如果当前存在事务,则将其挂起。适用于不需要事务支持的方法,例如只进行读取操作的方法。

使用场景:有时候我们需要执行一些不需要事务支持的操作,例如在调用远程接口时立刻插入一条日志记录,而不会因为后面的异常,导致事务回滚,调用日志没有留下;或者是插入防重表时,不开启使用直接插入,保证多个事务同时插入同一主键的数据时,能够快速失败,快速抛错,防止无用处理。

5.MANDATORY

要求当前存在事务,否则抛出异常。适用于必须在事务中运行的方法,如果没有事务,则抛出异常。

使用场景:较为重要的,必须开启事务的,较为底层代码,防治被不开启事务调用。

6.NEVER:

要求当前没有事务,否则抛出异常。适用于必须在非事务中运行的方法,如果存在事务,则抛出异常。

使用场景:方法内的数据库操作不希望参与事务,例如插入一条数据时,希望被其他服务或者线程立刻读取到。

7.NESTED

如果当前存在事务,则在当前事务的嵌套事务中执行。如果没有事务,则创建一个新的事务。这个选项适用于需要在事务内部进行嵌套事务的方法。文章来源地址https://www.toymoban.com/news/detail-507965.html

到了这里,关于Spring @Transactional注解事务传播机制propagation参数说明的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring——事务注解@Transactional【建议收藏】

    在某些业务场景下,如果一个请求中,需要同时写入多张表的数据或者执行多条sql,为了保证操作的原子性(要么同时成功,要么同时失败),避免数据不一致的情况,我们一般都会用到事务;Spring框架下,我们经常会使用@Transactional注解来管理事务; 本篇介绍Spring的事务注

    2024年02月03日
    浏览(35)
  • 【spring(四)】Spring事务管理和@Transactional注解

    🌈键盘敲烂,年薪30万🌈 目录 Spring中的事务管理 问题抛出: 解决方案: @Transactional注解: rollbackFor属性: propagation属性: 应用: 📕总结 知识回顾: ❓什么是事务 事务是对数据操作的集合,它是数据操作的最小执行单位,也就是说,要么一个事务中操作全部执行完毕,

    2024年01月17日
    浏览(36)
  • Spring 声明式事务讲解,和 @Transactional注解的用法

    目录 一、Spring框架介绍 二、什么是声明式事务 三、如何解决并发性事务问题 四、@Transactional注解的用法 Spring框架是一个开源的Java应用程序开发框架,旨在简化企业级Java应用程序的开发。它提供了一种轻量级的、全面的编程和配置模型,可以帮助开发人员构建可扩展、模块

    2024年01月25日
    浏览(41)
  • Spring 事务和事务传播机制

    目录 🐇今日良言:生命只有一次,你要活的畅快淋漓 🐇一、Sping 事务 1.Spring 中事务的实现 2.Spring 中事务隔离级别 🐇二、Spring 事务传播机制 1.基本概念 2.详细介绍 1.Spring 中事务的实现 在MySQL中也有事务,如下链接是博主之前写的关于MySQL事务的博客: 如何理解数据库事务

    2024年02月07日
    浏览(29)
  • spring @Transactional注解参数详解

    事物注解方式: @Transactional 当标于类前时, 标示类中所有方法都进行事物处理 , 例子: 当类中某些方法不需要事物时: 事物传播行为介绍: @Transactional(propagation=Propagation.REQUIRED) :如果有事务, 那么加入事务, 没有的话新建一个(默认情况下) @Transactional(propagation=Propagation.NOT_SUPPORTE

    2024年02月21日
    浏览(25)
  • Spring事务和事务传播机制(1)

    ❤️❤️❤️SSM专栏更新中,各位大佬觉得写得不错,支持一下,感谢了!❤️❤️❤️ Spring + Spring MVC + MyBatis_冷兮雪的博客-CSDN博客 在Spring框架中,事务管理是一种用于维护数据库操作的一致性和完整性的机制。Spring事务管理提供了灵活的方式来处理事务,包括事务的创建

    2024年02月12日
    浏览(27)
  • Spring—事务及事务的传播机制

    将一组操作封装成一个执行单元, 即这一组操作一同成功 / 一同失败 举个栗子🌰 未使用事务 滑稽老哥给女神转账 520 由于某种原因, 女神并未收到转账的 520, 而滑稽老哥却被扣款 520 使用事务 滑稽老哥给女神转账 520 由于某种原因, 女神并未收到转账的 520 因为使用事务, 所以

    2024年02月13日
    浏览(37)
  • Spring事务的四大特性+事务的传播机制+隔离机制

    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 事务是一个原子操作, 由一系列动作组成。 组成一个事务的多个数据库操作是一个不可分割的原子单元 ,只有所有的操作执行成功,整个事务才提交。 事务中的任何一个数据库操作失败

    2024年01月20日
    浏览(32)
  • Spring Boot 事务和事务传播机制

    事务定义 将一组操作封装成一个执行单元 (封装到一起),这一组的执行具备原子性, 那么就要么全部成功,要么全部失败. 为什么要用事务? 比如转账分为两个操作: 第一步操作:A 账户-100 元。 第二步操作:B账户 +100 元。 如果没有事务,第一步执行成功了,第二步执行失败了,

    2024年02月11日
    浏览(29)
  • Spring事务传播机制

    编程式事务管理:通过  TransactionTemplate 或者 TransactionManager 手动管理事务,实际应用中很少使用,这不是本文的重点,就不在这里赘述。 声明式事务管理:使用场景最多,也是最推荐使用的方式,直接加上@Transactional注解即可。 @Transactional 注解是用于声明事务性方法的注解

    2024年01月16日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包