我遇到了以下死锁情况。请参阅随附的对象定义和执行计划。这些计划是从确实发生此死锁的系统的缓存中提取出来的。
我了解所有这些数据告诉我的内容,但令我感到困惑的是为什么 spUpdateUserAccount 存储过程对 IX_Person_TaxPreparer_rowCreated 使用 S 锁。此锁定似乎是不必要的,并且在 spUpdateUserAccount 的执行计划中没有对 IX_Person_TaxPreparer_rowCreated 的引用。
...
我遇到了以下死锁情况。请参阅随附的对象定义和执行计划。这些计划是从确实发生此死锁的系统的缓存中提取出来的。
我了解所有这些数据告诉我的内容,但令我感到困惑的是为什么 spUpdateUserAccount 存储过程对 IX_Person_TaxPreparer_rowCreated 使用 S 锁。此锁定似乎是不必要的,并且在 spUpdateUserAccount 的执行计划中没有对 IX_Person_TaxPreparer_rowCreated 的引用。
...
我会在这里重新发布我在推特上的回复:
根据您发布的死锁 XML,它在调用的会话中列出了 3 的 trancount,
spUpdateUserAccount
该事务中的先前语句或批处理可能锁定了IX_Person_TaxPreparer_rowCreated
。我假设由于存在外键约束而持有此锁。
锁在事务期间保持不变,因此您的第二个语句在第一个提交打开的事务之前无法完成。