【问题标题】:shared and exclusive locks which will get the data first?共享锁和排他锁哪个会先获取数据?
【发布时间】:2015-08-28 02:20:11
【问题描述】:
假设我有以下内容:
SELECT - 共享锁 - 长时间运行
更新 - 排他锁
SELECT - 共享锁 - 长时间运行
这三个语句依次出现,第一个 select 执行时间长,这个时候更新来了,必须等待(冲突锁),然后是另一个 select(兼容锁)。是否允许选择获取行?或者,更新是否开始一行。如果允许第二个(或更多)选择“插入”,并且运行时间也很长,那么更新是否会陷入僵局?有没有办法防止这种情况,而不必将选择锁升级到更多东西?
【问题讨论】:
标签:
sql
sql-server
locking
【解决方案1】:
假设每个语句都来自自己的事务(即独立的、冲突的锁命名空间):
不,第三个 SELECT 不会在 UPDATE 前面“插入”。锁必须与等待列表中的所有锁兼容才能被授予。否则 X 锁会“饿死”。
有一些小字:
- SELECT 在默认的已提交读隔离级别下不保留长 S 锁
- 在某些特殊情况下,在等待列表之前显式授予锁定(它们“切入”)但这些情况永远不会应用于数据锁定(即选择、更新和插入)
另见SQL Server, Lock Manager, and “relaxed” FIFO