首页
学习
活动
专区
圈层
工具
发布

mysql 事务的传播机制

MySQL事务的传播机制是指当一个事务方法调用另一个事务方法时,事务如何在这些方法之间进行传播的规则。这些规则定义了事务的行为方式,包括事务的创建、挂起、提交或回滚等。

传播机制类型

  1. PROPAGATION_REQUIRED(默认):如果当前没有事务,就新建一个事务;如果已经存在一个事务,就加入这个事务。这是最常用的选择。
  2. PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
  3. PROPAGATION_MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。
  4. PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
  5. PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  6. PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  7. PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,就按PROPAGATION_REQUIRED执行。

应用场景

  • PROPAGATION_REQUIRED:适用于大多数业务逻辑,特别是当一个服务调用另一个服务,并且希望它们在同一个事务中运行时。
  • PROPAGATION_REQUIRES_NEW:适用于当一个事务需要独立于外部事务运行时,例如,日志记录或通知服务,它们需要自己的事务来保证数据的一致性。
  • PROPAGATION_SUPPORTS:适用于那些可以以事务方式运行,也可以非事务方式运行的服务。

遇到的问题及解决方法

问题:事务传播导致的数据不一致

原因:当使用PROPAGATION_REQUIRES_NEW时,如果内部事务失败并回滚,外部事务可能不会回滚,导致数据不一致。

解决方法:确保事务边界清晰,避免不必要的事务嵌套。使用PROPAGATION_NESTED可以在一个事务中执行多个子事务,其中一个子事务失败时,可以只回滚该子事务。

问题:事务传播导致的性能问题

原因:事务传播可能导致不必要的数据库锁,从而影响性能。

解决方法:优化事务边界,尽量减少事务的持有时间。使用PROPAGATION_SUPPORTSPROPAGATION_NOT_SUPPORTED来减少不必要的事务开销。

示例代码

以下是一个简单的Spring框架中使用PROPAGATION_REQUIRES_NEW的例子:

代码语言:txt
复制
@Service
public class OrderService {

    @Autowired
    private OrderRepository orderRepository;

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void createOrder(Order order) {
        // 创建订单逻辑
        orderRepository.save(order);
    }
}

@Service
public class CustomerService {

    @Autowired
    private OrderService orderService;

    @Transactional
    public void registerCustomerAndOrder(Customer customer, Order order) {
        // 注册客户逻辑
        // ...

        // 创建订单
        orderService.createOrder(order);
    }
}

在这个例子中,createOrder方法使用了PROPAGATION_REQUIRES_NEW,这意味着无论registerCustomerAndOrder方法是否在一个事务中,createOrder都会在一个新的事务中执行。

参考链接

通过理解这些传播机制及其应用场景,可以更好地设计和实现可靠的事务管理策略。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Spring事务的传播机制

Spring 中事务的实现 编程式事务(了解即可): 编程式事务需要自己手动写代码操作事务 这里用用户注册来进行演示: Spring ⼿动操作事务和上⾯ MySQL 操作事务类似, 有 3 个重要操作步骤...throw new IOException(e); } return "注册成功"; } 结果观察: 看数据库: Spring 事务传播机制...: Spring的事务的隔离级别和Mysql还是一样的,由于Mysql上没有方法调来调去,但是我们编程时会有方法上的调用可以不同方法没有用同一个事务会有嵌套等等情况,所以我们的事务还有传播机制!...事务主要有7中传播机制,接下来比较重要的我会用代码来解释一下 我会用一个Controller调用两个service里的方法来进行说明 1.Propagation.REQUIRED: 默认的事务传播级别...情况下,当子事务发生异常,然后处理了(手动回滚事务)后就不会影响父事务和其他子事务: 结果发生异常的事务没有提交,但是没有发生异常的事务得到提交!

44410
  • springboot事务的传播机制

    事务的传播机制 所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。...(,默认)REQUIRED :如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。 SUPPORTS :如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。...MANDATORY :如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。 REQUIRES_NEW :创建一个新的事务,如果当前存在事务,则把当前事务挂起。...NOT_SUPPORTED :以非事务方式运行,如果当前存在事务,则把当前事务挂起。 NEVER :以非事务方式运行,如果当前存在事务,则抛出异常。...NESTED :如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 REQUIRED 。

    67320

    Spring事务传播机制

    Spring事务传播机制 Spring事务传播类型 本文主要是讲述Spring事务传播机制,也就是大家开发过程中多多少少会遇到的父方法调用子方法,或者A方法调用B方法时事务的传播机制问题,但是在开始讲Spring...事务传播机制之前需要先讲一下Spring事务的几种传播类型,如图 REQUIRED REQUIRED表示如果当前没有事务,就创建一个事务,如果已经存在一个事务,就加入该事务,是Spring默认的事务传播类型...这种事务传播类型新创建的事务和被挂起的事务没有任何关系,他们是两个相互独立的事务,外部事务失败后回滚,不会回滚内部事务的执行结果,内部事务执行失败抛出异常,被外部事务捕获时,外部事务可以不处理内部事务的回滚操作...,如果内层事务回滚,不影响外层事务的提交和回滚,当封装事务不存在时,按照REQUIRED事务传播类型执行。...Spring 事务失效场景 数据库不支持事务 Spring事务生效的前提是连接的数据库存储引擎支持事务,比如Mysql 的MyISAM存储引擎不支持事务,则Spring事务会失效。

    48210

    Spring 事务传播机制

    但如果这三个操作分别位于不同的服务或方法中,如何确保它们处于同一个事务中? 这就是 Spring 事务传播机制要解决的问题。...事务传播机制(Transaction Propagation)就是定义这种处理规则的机制。 事务传播机制解决的核心问题是:当多个事务方法嵌套调用时,如何管理事务的边界和行为。...二、Spring 事务传播机制的实现原理 要理解事务传播机制,首先需要了解 Spring 是如何管理事务的。...虽然 Spring 的事务传播机制主要针对单库事务,但可以与分布式事务解决方案结合使用。...七、总结:掌握事务传播,构建可靠系统 Spring 事务传播机制是保证数据一致性的关键技术,它通过定义不同的传播行为,解决了嵌套方法调用中的事务管理问题。

    32610

    Spring事务传播机制

    通过事务传播行为控制当前的事务如何传播到被嵌套调用的目标服务接口方法中。...事务传播是Spring进行事务管理的重要概念,其重要性怎么强调都不为过。但是事务传播行为也是被误解最多的地方,在本文里,我们将详细分析不同事务传播行为的表现形式,掌握它们之间的区别。...事务传播行为种类 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播: 表1事务传播行为类型 事务传播行为类型...当使用PROPAGATION_NESTED时,底层的数据源必须基于JDBC 3.0,并且实现者需要支持保存点事务机制。...几种容易引起误解的组合事务传播行为 当服务接口方法分别使用表1中不同的事务传播行为,且这些接口方法又发生相互调用的情况下,大部分组合都是一目了然,容易理解的。

    64920

    Spring事务和事务传播机制

    .默认值为Isolation.DEFAULT propagation:事务的传播机制....3.3.1 什么是事务传播机制 事务传播机制就是:多个事务方法存在调用关系时,事务是如何在这些方法间进行传播的 比如有两个方法A,B都被@Transactional修饰,A方法调用B方法 A方法运行时...这个就涉及到了事务的传播机制 比如公司流程管理 执行任务之前,需要先写执行文档,任务执行结束,再写总结汇报 此时A部门有一项工作,需要B部门的支援,此时B部门是直接使用A部门的文档,还是新建一个文档呢...事务隔离级别解决的是多个事务同时调用一个数据库的问题 而事务传播机制解决的是一个事务在多个节点(方法)中传递的问题 3.3.2 事务的传播机制有哪些 @Transactional注解支持事务传播机制的设置...Spring事务传播机制有以下7种: Propagation.REQUIRED:默认的事务传播级别.如果当前存在事务,则加入该事务.如果当前没有事务,则创建一个新的事务。

    51110

    Spring 事务和事务传播机制

    事务的回顾 在 MySQL 学习阶段,已经了解到了事务是一组操作的集合,也就是把所有的操作作为一个整体,一起向数据库提交或者撤销操作,要么同时成功,要么同时失败 一个事务的操作流程包括了,开启事务,执行事务操作...编程式事务 Spring 手动操作事务和 MySQL 操作事务类似,也是分为开启事务,提交事务,回滚事务等三个操作,需要用到 DataSourceTransactionManager (事务管理器)来进行上述事务的操作...事务传播机制 事务传播机制是指在多个事务方法相互调用时,定义事务如何在这些方法之间传播的规则,也就是延用调用方法的事务还是再重新开启一个新事务 Spring 事务的传播机制有以下七种 事务传播机制 描述...理解(有 A,B 两个方法,A 调用 B 对于 B 来说) Propagation.REQUIRED 默认的事务传播级别。...如果 A 有事务,B 就创建一个嵌套事务,如果没有就创建新的 Propagation.REQUIRED 默认的事务传播级别。如果当前存在事务,则加入该事务。

    1.2K10

    Spring事务和事务传播机制(1)

    ❤️❤️❤️ Spring + Spring MVC + MyBatis专栏 在Spring框架中,事务管理是一种用于维护数据库操作的一致性和完整性的机制。...Spring事务管理提供了灵活的方式来处理事务,包括事务的创建、提交、回滚以及事务的传播行为。 一、为什么需要事务?...在开始讲解它们之前,咱们先来回顾事务在 MySQL 中是如何使用的。...1、MySQL 中的事务使用 事务在 MySQL 有 3 个重要的操作:开启事务、提交事务、回滚事务,它们对应的操作命令如下: -- 开启事务 start transaction; -- 业务执行 --.... propagation 事务的传播行为,默认值为Propagation.REQUIRED isolation 事务的隔离级别.默认值为Isolation.DEFAULT timeout 事务的超时时间

    61540

    Spring事务和事务传播机制(2)

    1、事务传播机制是什么?...Spring 事务传播机制定义了多个包含了事务的方法,相互调用时,事务是如何在这些方法间进行传递的。 2、为什么需要事务传播机制?...事务隔离级别是保证多个并发事务执行的可控性的(稳定性的),而事务传播机制是保证⼀个事务在多个调用方法间的可控性的(稳定性的)。...,而事务传播机制就是保证⼀个事务在传递过程中是可靠性的,回到本身案例中就是保证每个人在隔离的过程中可控的。...事务隔离级别解决的是多个事务同时调用⼀个数据库的问题,如下图所示: 而事务传播机制解决的是⼀个事务在多个节点(方法)中传递的问题,如下图所示: 3、事务传播机制有哪些?

    74720

    Spring 事务介绍(二)之 事务的传播机制

    Spring 事务介绍(二)之 事务的传播机制 Spring中对事务的支持 Spring 事务相关API: spring事务是在数据库事务的基础上进行封装扩展,其主要特性如下: 支持原有的数据事务的隔离级别...: @Transactional(propagation = Propagation.REQUIRES_NEW) 下面介绍一下spring事务的传播机制。...Spring事务传播机制 类别 事务传播类型 说明 支持当前事务 PROPAGATION_REQUIRED(必须的) 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。...常用的事务传播机制: PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中这个是默认传播机制。...总是新启一个事务,这个传播机制适用于不受父类方法事务影响的操作,比如某些业务场景下需要记录业务日志,用于异步反查,那么不管主体业务逻辑是否完成,日志都需要记录下来,不能因为主体业务逻辑报错而丢失日志。

    2.6K20

    【JavaEE进阶】Spring事务和事务传播机制

    Spring事务传播机制 1. 事务传播机制 事务传播机制是指在多个事务操作嵌套执行时,各事务之间如何相互关联和影响的规则。 2....为什么需要事务传播机制 事务传播机制的存在是为了**处理多个事务操作之间的关系和影响,以确保数据的一致性和完整性。...**以下是一些需要事务传播机制的情况: 嵌套调用:当一个事务方法内部调用另一个事务方法时,事务传播机制可以控制这两个事务之间的关系。...异常处理:在事务中,如果出现异常,事务传播机制可以决定是继续传播异常还是回滚事务。通过配置合适的传播行为,可以在异常发生时采取适当的处理方式,以保证数据的一致性。...事务传播机制有哪些 Spring框架提供了七种事务传播行为,用于控制事务方法的执行方式: (包含例子:假设你正在计划一次旅行。

    1.4K30

    Spring事务传播机制(最全示例)

    Spring的事务传播机制主要解决在多个方法之间,事务如何传递的问题,通常有7种传播类型:REQUIREDSUPPORTSMANDATORYREQUIRES_NEWNOT_SUPPORTEDNEVERNESTED...我们在这两个方法上使用注解,并配置不同的传播机制,通过查看数据库是否插入数据成功来演示不同传播机制的效果。...REQUIREDREQUIRED是Spring默认的传播机制,含义:如果当前存在事务,则加入该事务,如果不存在事务,则创建一个事务。下面我们分别演示一下:如果不存在事务,则创建一个事务。...,分别调用innerTransaction1()和innerTransaction2() ,并catch异常,innerTransaction1()和innerTransaction2()的传播机制都是...总结到此,Spring的7种传播机制就介绍完了。这里边的内容很多,是不好记忆的,其实我们也不必死记硬背,看看源码中的注释就可以了。如果再不行,就翻翻我的博客多看看吧~~

    3.6K20

    spring事务隔离级别、传播机制以及简单配置_mysql查看事务隔离级别

    基于类似于 EJB CMT 属性的传播行为定义。‎ ‎注意,除非启动实际的新事务,否则不会应用隔离级别和超时设置。‎ ‎...此级别允许一个事务更改的行在提交该行中的任何更改之前由另一个事务读取(“脏读取”)。如果回滚任何更改,则第二个事务将检索到无效行。...“幻像”行 传播行为 传播行为 描述‎ PROPAGATION_REQUIRED 支持当前事务;如果不存在,请创建一个新。‎...注意:对于具有事务同步功能的事务管理器‎, PROPAGATION_SUPPORTS ‎与完全没有事务略有不同,因为它定义了同步可能适用的事务范围。...类似于同名的 EJB 事务属性。‎ ‎注意:‎‎实际的事务暂停不会在所有事务管理器上开箱即用。

    1.5K10

    MySQL事务机制

    当一个事务中的所有操作都成功完成时,事务被提交;当有任何一个操作失败时,事务将会被回滚,使得数据回到事务开始之前的状态。这样保证了数据库中的数据始终处于一致的状态。...数据库系统通过将事务的操作记录持久化保存在磁盘上来实现事务的持久性,确保数据库的一致性和可靠性。要实现事务的持久性,数据库系统通常会使用日志记录和事务提交机制来保证事务的持久性。...隔离级别是相对于自己的事务还是其他事务 -->是相对于自己会话的事务来说的,先简单的拿读已提交为例; 自己会话的事务读取其他客户端的事务的数据必须是已经提交的;并不是自己设置事务为读已提交,其他客户端的事务就读不到的我的事务的数据了...,如果小红的余额没减货或者小明的余额没增,那就是不一致; 一致性算是一种目的和要求,通过前面的原子性,隔离性,持久性来保证事务的一致性; 问题 不可重复读性(已经提交的数据) 在MySQL事务中,不可重复读...; 自动提交机制--autocommit SQL语句:Set autocommit=1(默认就是自动提交的) 因为默认就是自动提交的所以我这里设为不自动提交; 什么是默认提交呢?

    36610

    Spring事务传播机制的理解与代码验证

    先来了解一下Spring事务的传播机制(由于英语不好,直接google翻译了) 简单终结一下: 枚举 翻译 REQUIRED 支持当前事务,如果不存在则创建新事务(默认) SUPPORTS 支持当前事务...在无事务的方法里,调用另一个事务传播行为NESTED的方法,同时NESTED的方法会报错,以此来检查嵌套事务是否会影响无事务方法的开启。                         ...在有事务的方法里,调用另一个事务传播行为NESTED的方法,同时NESTED的方法会报错,以此来检查嵌套事务是否会影响当前事务方法的提交。                        ...在有事务的方法里,调用另一个事务传播行为NESTED的方法,当前事务会报错,以此来检查是否会影响嵌套事务提交。   ...特别注意:NESTED传播行为在有些地方解释为不通的厂商实现机制不一样,用之前需要再充分了解一下,从Spring的源码上看,也确实如此。

    17210

    18个示例详解 Spring 事务传播机制

    什么是事务传播机制 事务的传播机制,顾名思义就是多个事务方法之间调用,事务如何在这些方法之间传播。...举个例子,方法 A 是一个事务的方法,方法 A 执行的时候调用了方法 B,此时方法 B 有无事务以及是否需要事务都会对方法 A 和方法 B 产生不同的影响,而这个影响是由两个方法的事务传播机制决定的。...新建 NOT_SUPPORTED 不支持 NEVER 从不 NESTED 嵌套 事务的传播机制,是 spring 规定的。...因为在开发中,最简单的事务是,业务代码都处于同一个事务下,这也是默认的传播机制,如果出现的报错,所有的数据回滚。...,直接回滚 测试源码 传播属性源码 参考 带你读懂Spring 事务——事务的传播机制

    3.1K21
    领券