mysql两个事务同时修改_MySQL Repeatable-Read 多事务修改一个记录行同步问题

在MySQL的Repeatable-Read事务隔离级别下,两个事务在读取上互不影响,但在更新时会出现阻塞。当事务A先更新记录后提交,事务B的更新操作才会执行,但影响行数为0。使用`FOR UPDATE`查询时,事务能即时看到其他事务的更新,但未加锁的普通查询则无法看到最新数据。
摘要由CSDN通过智能技术生成

MySQL 在处于Repeatable-Read 事务隔离级别下时, 两个事务之间的修改在读上不会相互影响,在写上却会受到影响

例子

1.

事务A

e4ab6bec18ecd27584f99f2a33a0468d.png

事务B

b0c62abfe5a8b6d3dabdc3d65ef5380e.png

现在事务A B看到的数据是一样的

2.

事务A更新

def303b1399668c4365ea6b0967e15b4.png

事务B查询

cb5b5e421a1956652a9265a2684d4520.png

可见 在 读上AB互不影响,因为B看到的还是原来的数据

3.

B更新,更新被挂起,因为A执行了更新且事务还没提交

db7e243665390a0f38525713ebaa64e0.png

A提交事务

2b74517be5f2de41e5d8c5a5d8ae6b45.png

A提交事务后,B的更新操作得以执行,但是更新却影响了0行

580e601b063f90a91def57fb62cb69f9.png

4.

B都提交事务

1822e75d865b1c8e7e4d0a885f6f3a5c.png

A,B再查询

73855fd6c4de5abb0044ad8e19fdb02b.png

可见结果是A的修改结果,所以多事务同时修改同一条记录并不会出现我们不期待的结果(A改完以后B又改成了另一个值),只不过很奇怪的是在事务内update对select没有影响,对update确实有影响的

______________________________________________

另外,如果是使用for update来查询,也是可以即时看到别的事务的更新的结果的,由于for update需要获取排他锁,所以它必须在别的事务的更新行为结束且事务提交以后才能继续执行,那么这样会有一个很奇异的结果,那就是for update的select查询能看到跟新的结果,而直接用select查询时无法看到最新查询结果的,如下

事务A开始事务并执行更新

61dc7f1fcc95ea1136be87c8fc81c927.png

现在oldroot已经被跟新为newroot

2. B事务执行for update 查询会被挂起,因为这一行被加了排他锁

c445688b7bf3d4f1b250138d801a7f70.png

3. A提交事务, B被挂起的操作会继续执行,然而却得到了空集,因为for update的查询是可以及时获取最新数据的,而此时oldroot已经被改为了newroot

同时,我们在事务B执行对newroot的for update查询,是可以得到结果的,然而如果没有for update,得到的又是空集

事务A提交

34ff6785c5b658b18279da24b7a52448.png

事务B查询

3076a648017a31aae906db01bf241b32.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值