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