SQL Server如何确定选择表时锁定的顺序?


10

当系统处于负载状态时,我有两个存储过程处于死锁状态。当Proc B插入同一张表时,Proc A从表中选择。锁定图显示Proc A具有Proc B希望为其IX模式锁定的S模式页面锁定,但是Proc A正在等待针对Proc B已经具有IX模式页面锁定的另一页面的S模式页面锁定。 。

显然,可以通过确保两个查询以相同的顺序锁定表中的页面来解决此问题,但是我不知道该怎么做。

我的问题是:SQL Server如何确定在执行INSERT和SELECT时锁定页面的顺序,以及如何修改此行为?

Answers:


2

SQL Server如何确定在执行INSERT和SELECT时锁定页面的顺序

未确定-由内部处理完成,具体取决于查询优化器的输出。

以及如何修改这种行为?

控制您的隔离。如果您为了写而阅读,请告诉SQL Server立即获得写锁。点关闭。


1

当前,过程A具有共享锁。

“资源上存在共享(S)锁时,没有其他事务可以修改数据。” http://msdn.microsoft.com/zh-cn/library/aa213039%28v=sql.80%29.aspx

如果您使用的是sql 2005或更高版本,请尝试使用快照隔离。

“快照隔离级别使用行版本控制来提供事务级别的读取一致性。读取操作不获取页锁或行锁;仅获取SCH-S表锁。读取另一个事务修改的行时,它们将检索该行的版本事务开始时已存在。仅当ALLOW_SNAPSHOT_ISOLATION数据库选项设置为ON时,才可以对数据库使用快照隔离。默认情况下,对于用户数据库,此选项设置为OFF。” http://msdn.microsoft.com/en-us/library/ms189122.aspx

由于仅获取Sch-S锁,因此您的“读取”不应阻止您的“写入”。

“架构稳定性(Sch-S)锁不会阻止任何事务锁,包括排他(X)锁。” http://msdn.microsoft.com/en-us/library/ms189122.aspx

请记住,快照隔离级别大量使用了tempdb进行行版本控制,因此请适当调整其大小并遵循tempdb磁盘策略的最佳实践。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.