2011-09-08 77 views
0

比方说,我有以下几点:共享锁和独占锁将首先获取数据?

选择 - 共享锁 - 长期运行

更新 - 排他锁

选择 - 共享锁 - 长期运行

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

回答

1

假设每个语句来对自己的交易(即独立的,相互冲突的锁命名空间。):

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

有一些SmallPrint的:

  • 选择不保留默认下长S锁提交读隔离级别
  • 有当锁明确未来等待列表授予某些特殊情况下(他们'切),但这种情况下不会应用于数据锁定(即选择与更新与插入)

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

+0

感谢日伟大的链接和解释。 – aepheus