Sql server 更新锁在数据库中的工作原理。

Sql server 更新锁在数据库中的工作原理。,sql-server,transactions,locking,Sql Server,Transactions,Locking,当我阅读有关sql server database 2008的文档时,我知道有三种类型的锁定模式: 独家(X) 共用 更新(U) 我了解独占锁和共享锁的工作原理。唯一的问题是更新(U)锁在以下情况下如何工作: 事务T1在rowA上开始并获取共享锁 事务T2在rowA上开始并获取更新锁 事务T2将更新rowA,因此,请求将锁从更新模式升级到独占模式。当前,T1尚未释放行A上的共享锁 问题是在这种情况下,数据库的行为如何?因为我们知道,当另一个事务持有资源上的共享锁时,无法获取独占锁 数据

当我阅读有关sql server database 2008的文档时,我知道有三种类型的锁定模式:

  • 独家(X)
  • 共用
  • 更新(U)
我了解独占锁和共享锁的工作原理。唯一的问题是更新(U)锁在以下情况下如何工作:

  • 事务T1rowA上开始并获取共享锁
  • 事务T2rowA上开始并获取更新锁
  • 事务T2将更新rowA,因此,请求将锁从更新模式升级到独占模式。当前,T1尚未释放行A上的共享锁
问题是在这种情况下,数据库的行为如何?因为我们知道,当另一个事务持有资源上的共享锁时,无法获取独占锁

数据库是否会终止T1并升级T2的锁?
或者它会等到T1释放共享锁吗

如果sql server中存在死锁牺牲品,则它始终是分配了最少锁/资源的进程。如果SELECT语句和UPDATE语句冲突,则SELECT语句几乎总是受害者,因为为该操作分配的锁较少。谢谢!那么您的意思是,当T2请求将“更新锁”升级为“独占锁”时,T1持有的共享锁将被强制释放?T1将被终止或暂停,直到它可以获得共享锁?我会猜测,所以我无法回答。我有一次继承了一个流量很大的数据库,不得不对所有不重要的读取进行NOLOCK。我一天收到很多死锁图。受害者从来就不是一个读者,而死锁总是发生在读者和作者之间,与你上面描述的情况非常相似。我所说的锁评论是基于我对该问题的研究。如果sql server中存在死锁受害者,那么它将始终是分配了最少锁/资源的进程。如果SELECT语句和UPDATE语句冲突,则SELECT语句几乎总是受害者,因为为该操作分配的锁较少。谢谢!那么您的意思是,当T2请求将“更新锁”升级为“独占锁”时,T1持有的共享锁将被强制释放?T1将被终止或暂停,直到它可以获得共享锁?我会猜测,所以我无法回答。我有一次继承了一个流量很大的数据库,不得不对所有不重要的读取进行NOLOCK。我一天收到很多死锁图。受害者从来就不是一个读者,而死锁总是发生在读者和作者之间,与你上面描述的情况非常相似。我的评论是基于我对这个问题的研究。