Sql server 插入和更新之间的死锁
我有两种方法Sql server 插入和更新之间的死锁,sql-server,spring,hibernate,transactions,Sql Server,Spring,Hibernate,Transactions,我有两种方法 @Transactional(isolation = Isolation.READ_UNCOMMITTED) 该方法并行运行 方法1)在表A中插入行 方法2)更新表A中的行 但有时我会在两个查询之间出现死锁:1个插入和1个更新 我不明白为什么我会得到这个LockAcquisitionException,因为当我检查sql分析器时,insert查询和udpate查询没有任何共同点=>我没有尝试更新和插入同一行(id值不同) 为什么会发生这种情况,又是如何发生的 谢谢 我通过禁用
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
该方法并行运行
- 方法1)在表A中插入行
- 方法2)更新表A中的行
我通过禁用索引上的页面锁定解决了这个问题
WITH (ALLOW_PAGE_LOCKS = OFF)
我意识到我有:
交易1
更新表A,然后更新表B
交易2
更新表B,然后更新表A
彼此死锁(因为事务1长约5分钟)
T1锁定表A上的第X页
T2锁定表B上的第Y页
T2请求锁定表A上的第X页,然后等待
(稍后T1要更新表B)
表B上的T1请求锁定页面Y=>死锁
为什么对事务使用READ_UNCOMMITTED隔离级别?绝对不建议插入/更新。使用READ_COMMITTED.Try查看sys.partitions中的SELECT OBJECT_NAME([OBJECT_id]),其中partition_id=72057594051624960;要查找关联对象是什么,您可以锁定更新index@IgorMicev它的速度更快,我有多个线程可以插入到同一个表中,方法1)可以插入大量数据,一个事务可以持续10分钟。我不想锁定应用程序。@SteveFord objectId就是表本身,更新索引可以解决问题,我在表上有6个索引,但探查器没有提到任何索引,只是表在你的问题中,你只谈到它在更新和插入单个表时死锁,但在你的回答中,你谈到了两个表。请将问题调整为有两个表,因为您的解决方案无法回答问题