TDSQL MySQL数据库锁应该这样用

本文详细介绍了TDSQL MySQL数据库在RR隔离级别下出现幻读的问题,以及如何通过使用共享锁和排它锁来解决这个问题。分析了共享锁和排它锁的特性、应用场景,并强调两者在特定情况下不能互相替代。
摘要由CSDN通过智能技术生成

本文针对我们平时使用场景最多的TDSQL MySQL数据库在RR隔离级别下容易产生幻读的问题,来进行分析并分享解决方案。

1

PartⅠ 问题回顾

幻读的定义:幻读是指某个事务读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前事务再次读取该范围内的记录时就会产生幻行。

举一个例子,user表中id是主键索引,T1是主事务: image.png

T2是干扰事务: image.png

Step1:T1开始,并检查user表中是否有id=1的记录。 Step2:T2开始,插入id为1的记录且成功执行。 Step3:T1查到没有id=1的记录就开始插入id=1的记录,但是失败了(主键冲突)。 Step4:T1不能接受现实又查了一遍是否存在id=1的记录,发现的确没有,彻底崩溃...

从第四步我们可以看出,在主事务执行commit之前,不管再查多少次,都无法获取到id=1的这条记录,因为此时它已经产生幻读了。

1

Part Ⅱ 解决方案

要解决幻读的问题有两种方案,一种是采用SERIALIZABLE 数据隔离级别,但是这种方案会强制把所有事务排序,来达到事务之间不互相冲突产生幻读的问题,当事务并发高的时候&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值