假设我有以下内容:
SELECT - 共享锁 - 长时间运行
更新 - 独家锁定
SELECT - 共享锁 - 长时间运行
这三个语句按顺序排列,第一个选择需要很长时间才能执行,此时更新到来并且必须等待(冲突锁定),然后是另一个选择(兼容锁定)。是否允许选择获取行?或者,更新是否开始一行。如果第二个(或更多)选择被允许“切入”,并且也在长时间运行,更新最终会陷入僵局吗?有没有办法防止这种情况,而不必将选择锁升级为更多?
答案 0 :(得分:1)
假设每个语句都有自己的事务(即独立的,冲突的锁名称空间):
不,第三个SELECT不会在UPDATE前“切入”。锁必须与等待列表中的所有锁兼容才能被授予。否则X锁会“饿死”。
有一些小图: