Mysql事务传播机制

都知道事务传播机制有七种,但是都是 面试背的,实际应用中从来没注意过。这次同事写的时候没注意就给我留了个坑。
有这样一个情况,事务A里边嵌套了事务B,在事务的传播机制上,同事写成了PROPAGATION_REQUIRES_NEW,我当时也没注意,结果测试的时候出了个bug,查了好久。
起因是这样:事务A里边会对一个数据记录data是否存在进行判断,不存在就新增,事务B里边也做了一次对数据记录data是否存在的判断,不存在就新增。
代码进入事务A,发现数据库没有,新增data,接着进入事务B, 事务A挂起,事务B看不到事务A未提交的数据,发现data不存在,进行写入,事务B提交,事务A提交的时候发生唯一索引冲突,回滚,但是事务B没有回滚。因为A和B是两个独立的事务。

实际上在这种情况下,我们需要保证两个事务的上下文互相可见,所以需要变成同一个事务,传播机制用PROPAGATION_REQUIRED就可以了,这样要么全部失败要么全部成功。

而spring里边事务注解默认的传播机制就是这个级别,
在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL事务传播机制是用来决定事务在不同的操作中如何传播和影响的规则MySQL支持以下几种事务传播机制: 1. 作为默认的传播机制MySQL使用的是REPEATABLE READ(可重复读)级别。在该级别下,事务开始时会创建一个快照,事务中的查询都会使用该快照作为读取数据的基础。这意味着在事务中,无论其他事务是否对数据进行了修改,读取的数据都是一致的。 2. READ COMMITTED(已提交读)是另一种常用的传播机制。在该级别下,事务中的查询会读取到其他已提交事务所做的修改,而不是使用快照。这意味着同一事务内的两个查询可能会返回不一致的结果。 3. READ UNCOMMITTED(未提交读)是最低级别的传播机制。在该级别下,事务中的查询会读取到其他未提交事务所做的修改。这可能导致脏读(读取到未提交的数据)和不可重复读(同一查询返回不同结果)。 4. SERIALIZABLE(可串行化)是最高级别的传播机制。在该级别下,事务串行执行,确保每个事务都感知到其他事务所做的修改。这种级别保证了最高的数据一致性,但也会带来性能损耗。 要设置事务传播机制,可以使用以下语句: ``` SET TRANSACTION ISOLATION LEVEL <level>; ``` 其中,<level>可以是上述提到的几种传播机制之一。 需要注意的是,不同的数据库管理系统可能对事务传播机制有所不同,以上是MySQL传播机制示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值