Java 为什么这两个数据库会提交死锁? (@1 varchar(8000),@2 varchar(8000),@3 varchar(8000),@4 varchar(8000))更新[TABLE_NAME]设置[END_TIME]=@1,[ERROR]=@2,其中[USER_ID]=@3和[SESSION_ID]=@4和[END_TIME]为空 更新表“名称集结束时间='2012-03-30 12:07:45',错误='FALSE',其中用户ID='username'和会话ID='095d42ad-67d8-444f-8e51-4576f6b940d8',结束时间为空

Java 为什么这两个数据库会提交死锁? (@1 varchar(8000),@2 varchar(8000),@3 varchar(8000),@4 varchar(8000))更新[TABLE_NAME]设置[END_TIME]=@1,[ERROR]=@2,其中[USER_ID]=@3和[SESSION_ID]=@4和[END_TIME]为空 更新表“名称集结束时间='2012-03-30 12:07:45',错误='FALSE',其中用户ID='username'和会话ID='095d42ad-67d8-444f-8e51-4576f6b940d8',结束时间为空,java,sql-server,database-deadlocks,Java,Sql Server,Database Deadlocks,上面是客户从站点发送给我的死锁跟踪的净化实例。据我所知,当两个提交试图无序访问同一个表时,就会发生死锁 然而,在本例中,只有一个表,执行这些sql语句的代码从队列中提取它们并按顺序执行它们 为什么会出现这种死锁?这取决于DBMS,但当两个不同的用户会话试图锁定另一个会话也试图不受限制地访问的资源(行或表)时,可能会发生死锁,不必进行提交 <executionStack> <frame procname="adhoc" line="1" sqlhandle="0x020

上面是客户从站点发送给我的死锁跟踪的净化实例。据我所知,当两个提交试图无序访问同一个表时,就会发生死锁

然而,在本例中,只有一个表,执行这些sql语句的代码从队列中提取它们并按顺序执行它们


为什么会出现这种死锁?

这取决于DBMS,但当两个不同的用户会话试图锁定另一个会话也试图不受限制地访问的资源(行或表)时,可能会发生死锁,不必进行提交

<executionStack>
     <frame procname="adhoc" line="1" sqlhandle="0x02000000cb01b3329478b4bbe70e115ebcb8f5f4a8610e7e">
(@1 varchar(8000),@2 varchar(8000),@3 varchar(8000),@4 varchar(8000))UPDATE [TABLE_NAME] set [END_TIME] = @1,[ERROR] = @2  WHERE [USER_ID]=@3 AND [SESSION_ID]=@4 AND [END_TIME] IS NULL     </frame>
     <frame procname="adhoc" line="1" sqlhandle="0x02000000ef595e01eab1df10c694910f5810afb17d814663">
UPDATE TABLE_NAME SET END_TIME='2012-03-30 12:07:45', ERROR='FALSE' WHERE USER_ID='username' AND SESSION_ID='095d42ad-67d8-444f-8e51-4576f6b940d8' AND END_TIME IS NULL     </frame>
 </executionStack>
会话1:锁定(例如读取以进行更新)
会话2:锁定(例如,读取以进行更新)
会话1:提取
会话2:获取

如果提取或其他操作需要取消锁定访问或干净读取,则存在死锁。

这些语句所涉及的事务中还发生了什么?您需要添加锁资源、所有者和等待者,以了解死锁信息。它们在XML中。
Session 1 :  lock  <row x>   (e.g. read for update)
Session 2 :  lock  <row y>   (e.g. read for update)
Session 1 :  fetch <row y>
Session 2 :  fetch <row x>