Sql server SQL server是否对select和update语句进行优先级排序?

Sql server SQL server是否对select和update语句进行优先级排序?,sql-server,sql-server-2014,Sql Server,Sql Server 2014,假设SQL server同时从不同的线程和连接接收到同一个表的select和update语句 他们中有谁得到优先考虑吗 我知道,若表已经被锁定进行更新,select语句将延迟到更新完成(update语句默认情况下锁定表,我不正确?)。若表锁由于更新而持续很长时间,select语句将被取消,等待错误太多 那么,当同时接收到这两个数据时会发生什么呢?一个SELECT语句将在它读取的任何行上放置一个共享锁-根据隔离级别,该锁将保持不同的时间。在默认的readcommitted隔离级别中,锁仅在实际读取

假设SQL server同时从不同的线程和连接接收到同一个表的select和update语句

他们中有谁得到优先考虑吗

我知道,若表已经被锁定进行更新,select语句将延迟到更新完成(update语句默认情况下锁定表,我不正确?)。若表锁由于更新而持续很长时间,select语句将被取消,等待错误太多


那么,当同时接收到这两个数据时会发生什么呢?

一个
SELECT
语句将在它读取的任何行上放置一个共享锁-根据隔离级别,该锁将保持不同的时间。在默认的
readcommitted
隔离级别中,锁仅在实际读取行时保持-一旦读取,锁将立即释放

shared锁与其他共享锁兼容,因此任何数量的
SELECT
语句都可以同时读取相同的行

UPDATE
语句将在要更新的行上放置一个UPDATE(U)锁,以读取现有值。然后,在完成此操作之后,在实际更新的值被写回之前,锁被转换为写入数据时的
独占(X)锁。这些锁将一直保持,直到提交(或回滚)它们正在执行的事务为止

更新锁与另一个更新锁或独占锁不兼容。但是,它与共享锁兼容-因此,如果
UPDATE
语句当前仅读取现有值,则另一个事务可能会使用带有共享锁的
SELECT
语句读取这些相同的值

exlusive锁与任何东西都不兼容-当
X
锁位于行上时,您甚至无法再读取该行

因此,如果有两条语句进入并尝试访问同一行,那么:

  • 如果
    SELECT
    先出现,它将在行上放置一个
    S
    锁,读取它,然后通常再次释放该锁
  • 同时,
    UPDATE
    语句可以在行上放置一个
    U
    锁并读取现有值;在释放
    S
    锁之前,无法将锁“升级”到
    X
    ——如果没有发生这种情况,
    UPDATE
    语句将等待,如果
    S
    锁从未释放,则最终超时

  • 如果先出现
    更新
    锁,它将在行上放置一个
    U
    锁以读取现有值

  • 同时,另一个事务可以在行上放置
    S
    锁来读取它
  • 同样地:
    UPDATE
    语句只有在
    S
    锁解除后才能进入
    X
    级别写回新值,否则将超时

  • 如果
    UPDATE
    锁首先出现,它将在行上放置
    U
    锁以读取现有值,并且已经在行上放置
    X
    锁以实际执行更新

  • 此时,其他事务甚至无法读取该行-它们将不得不等待(或者超时,如果它们需要太长时间才能得到服务)

有关本主题的更深入概述和更多详细信息,请阅读。

如果您尝试两条语句,则不会同时开始执行,其中一条语句将是第一个(即使是纳秒)死锁检测。要撤消的资源最少的命令将成为死锁牺牲品。这始终是一个select命令。
UPDATE
锁定它正在更新的行,而不是整个表!(当然,除非一次更新的行数超过5000行,否则可能会升级为表级锁)@lrb这是否意味着SQL server开始执行这两个查询,并且在看到死锁时会取消select语句,对吗?@marc_s ty了解更多详细信息