mysql 共享锁(读写锁) 修改数据问题(update,insert)(LOCK IN SHARE MODE)

1 篇文章 0 订阅
1 篇文章 0 订阅

个人测试发现,共享锁某些情况下也可以修改数据(因为我一直误以为,只要加了共享锁,即使只有一个,也不能修改,实际测试后结论:只有一个共享锁的话,当前持有这个共享锁的,可以修改数据,并且共享锁变为排它锁
(要是理解有误,麻烦大佬指正,感谢帮助,理解不深,全靠查的文章和自己测试,有可能有理解偏差)

以下是几次测试描述(自己sql语句测试的,比较懒 没有截图)
测试1:
首先事务A用了select * from table where id=1 LOCK IN SHARE MODE 增加共享锁,
然后其他事务B也select * from table where id=1 LOCK IN SHARE MODE 增加共享锁
,此时比如事务A操作update修改id=1的内容,发现语句一直在等待,无法修改,最后超时报错([Err] 1205 - Lock wait timeout exceeded; try restarting transaction 超过锁定等待超时;尝试重新启动事务 )。

测试2:
首先事务A用了select * from table where id=1 LOCK IN SHARE MODE 增加共享锁,
然后其他事务B也select * from table where id=1 LOCK IN SHARE MODE 增加共享锁
,此时比如事务B操作update修改id=1的内容,发现语句一直在等待,无法修改,
接下来事务A操作update修改id=1的内容,没有等待,直接报错([Err] 1213 - Deadlock found when trying to get lock; try restarting transaction 尝试获取锁时发现死锁;尝试重新启动事务),
事务B修改成功,因为事务A已经释放共享锁

测试2:
首先事务A用了select * from table where id=1 LOCK IN SHARE MODE 增加共享锁,
直接修改数据,修改成功
然后其他事务B也select * from table where id=1 LOCK IN SHARE MODE 增加共享锁,
共享锁获取失败,应该是事务A-update之后,变为了排它锁

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值