Sql server SQL server是否对select和update语句进行优先级排序?
假设SQL server同时从不同的线程和连接接收到同一个表的select和update语句 他们中有谁得到优先考虑吗 我知道,若表已经被锁定进行更新,select语句将延迟到更新完成(update语句默认情况下锁定表,我不正确?)。若表锁由于更新而持续很长时间,select语句将被取消,等待错误太多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隔离级别中,锁仅在实际读取
那么,当同时接收到这两个数据时会发生什么呢?一个
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了解更多详细信息