共享和排他锁将首先获取数据?

时间:2011-09-08 21:18:29

标签: sql sql-server locking

假设我有以下内容:

SELECT - 共享锁 - 长时间运行

更新 - 独家锁定

SELECT - 共享锁 - 长时间运行

这三个语句按顺序排列,第一个选择需要很长时间才能执行,此时更新到来并且必须等待(冲突锁定),然后是另一个选择(兼容锁定)。是否允许选择获取行?或者,更新是否开始一行。如果第二个(或更多)选择被允许“切入”,并且也在长时间运行,更新最终会陷入僵局吗?有没有办法防止这种情况,而不必将选择锁升级为更多?

1 个答案:

答案 0 :(得分:1)

假设每个语句都有自己的事务(即独立的,冲突的锁名称空间):

不,第三个SELECT不会在UPDATE前“切入”。锁必须与等待列表中的所有锁兼容才能被授予。否则X锁会“饿死”。

有一些小图:

  • SELECT不会在默认的读提交隔离级别
  • 下保留长S锁
  • 有一些特殊情况,在等待列表之前明确授予锁定(它们'切入'),但这些情况从不适用于数据锁(即选择与更新与插入)

另见SQL Server, Lock Manager, and “relaxed” FIFO