【问题标题】: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

    【讨论】:

    • 感谢伟大的链接和解释。
    猜你喜欢
    • 2018-05-16
    • 2013-11-15
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多