gpt4 book ai didi

sql-server - SQL Server Profiler 中的死锁图显示同一聚集键上的相互锁定

转载 作者:行者123 更新时间:2023-12-03 02:46:43 25 4
gpt4 key购买 nike

我正在尝试使用 SQL Server Profiler 确定死锁的原因。这是死锁图: Deadlock graph这两个语句都是插入,后跟selectscope_identity();实际上有2个并发进程在一个循环中重复执行insert-select_identity

我期望的是,insert聚集索引 采取独占锁定,select非聚集索引采取共享锁定-聚集索引,然后等待对方释放各自的索引。

我看到的是两个进程都等待释放相同的资源 - 聚集索引。怎么会这样?特定的资源应该属于一个进程或另一个进程。我在这里想念什么?提前感谢大家。

编辑:是的,隔离级别是可串行化的。PS:可能,我对非聚集索引上的共享锁的假设是错误的,因为我的 select 不包含 where 语句

编辑2:这是 xml 的一部分:

 <resource-list>
<keylock hobtid="72057594148028416" dbid="29" objectname="<confidential>" indexname="PK_WP_Inbound_StockTransactionLine" id="lock9641700" mode="RangeS-S" associatedObjectId="72057594148028416">
<owner-list>
<owner id="process8e09288" mode="RangeS-S"/>
</owner-list>
<waiter-list>
<waiter id="process991ce08" mode="RangeI-N" requestType="convert"/>
</waiter-list>
</keylock>
<keylock hobtid="72057594148028416" dbid="29" objectname="<confidential>" indexname="PK_WP_Inbound_StockTransactionLine" id="lock9641700" mode="RangeS-S" associatedObjectId="72057594148028416">
<owner-list>
<owner id="process991ce08" mode="RangeS-S"/>
</owner-list>
<waiter-list>
<waiter id="process8e09288" mode="RangeI-N" requestType="convert"/>
</waiter-list>
</keylock>
</resource-list>

据此,我认为这是由可串行化隔离引起的范围扫描(通过谷歌搜索)。但我仍然不明白这是如何发生的以及建议的补救措施是什么。

最佳答案

考虑从访问同一记录的两个并行事务(T1 和 T2)调用以下代码。

Read LastRow
Insert AtLastRow

假设上下文切换发生在读取时。所以操作顺序是

T1 Read LastRow
T2 Read LastRow
T2 Insert AtLastRow // This will wait for T1 to finish.
T1 Insert AtLastRow // This will wait for T2 to finish. Hence deadlock!

以上读取将采用Range S-S锁定。最后插入还需要 Range I-N,它与其他事务持有的现有 Range S-S 锁不兼容。因此它会等待。

有多种方法可以解决此问题。

  1. 使用已提交读作为总体隔离级别且不可序列化。这将防止获取范围锁。
  2. 使用更新锁定 (UPDLOCK) 进行读取。这将需要独家更新锁定第一名。因此其他事务将在 Read 本身处等待。
  3. 避免读取和插入/更新模式。直接往前走插入/更新并让它失败。

如果您有任何疑问,请告诉我。

关于sql-server - SQL Server Profiler 中的死锁图显示同一聚集键上的相互锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12578853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com