Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 插入和更新之间的死锁_Sql Server_Spring_Hibernate_Transactions - Fatal编程技术网

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中的行

但有时我会在两个查询之间出现死锁:1个插入和1个更新

我不明白为什么我会得到这个LockAcquisitionException,因为当我检查sql分析器时,insert查询和udpate查询没有任何共同点=>我没有尝试更新和插入同一行(id值不同)

为什么会发生这种情况,又是如何发生的

谢谢


我通过禁用索引上的页面锁定解决了这个问题

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个索引,但探查器没有提到任何索引,只是表在你的问题中,你只谈到它在更新和插入单个表时死锁,但在你的回答中,你谈到了两个表。请将问题调整为有两个表,因为您的解决方案无法回答问题