2012-07-19 70 views
0
<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][email protected] AND [SESSION_ID][email protected] 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> 

以上是客戶從站點發送給我的死鎖痕跡的消毒實例。據我瞭解,當兩次提交嘗試按順序訪問相同的表時,發生死鎖。這兩個數據庫爲什麼會死鎖?

但是在這個實例中只有一個表,執行這些sql語句的代碼將它們從隊列中拉出並依次執行它們。

爲什麼會出現這種僵局?

+0

這些陳述涉及的交易中還發生了什麼? – 2012-07-19 14:13:17

+0

您需要添加鎖資源,所有者和服務員,以瞭解死鎖信息。他們在XML中。 – 2012-07-19 14:22:22

回答

1

它依賴於DBMS,但當兩個不同的用戶會話試圖鎖定資源(行或表)時,會發生死鎖,而另一個會話也試圖無限制地訪問資源,則不必執行提交。

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> 

如果提取或其他操作需要解鎖訪問或乾淨讀取,則會出現死鎖。