enq: DX - contention

action929發表於2008-05-27
今天用addm檢查資料庫的時候,報了一個enq: DX - contention的過多等待。[@more@]

enq: DX - contention 是分散式事務所使用的鎖。

select * from v$lock where type='DX'

發現

C0000001380D5D00 C0000001380D5D20 2833 DX 16 0 1 0 1121192 0
C0000001380E76C8 C0000001380E76E8 2234 DX 51 0 4 0 4150509 1
C0000001380E7B08 C0000001380E7B28 2784 DX 51 0 0 6 4150445 0

這些鎖的時間可不小啊,原來是2234堵住了2784,而且時間很久了,殺掉2234後,正常

不過 DX 這個鎖是如何發生的呢,做了一個小測試

資料庫A,資料庫B

資料庫A上有 dblinkB 連線到資料庫B

plsql執行

Select * from tableB@dblinkb

當資料沒有全部顯示出來的時候,會發現

資料庫A上:

1) 產生了一個事務,需要commit 或者 rollback

2) 查詢v$lock 發現,當前session 2個鎖

C0000000FE540D28 C0000000FE540D48 1068 DX 38 0 4 0 0 0

C0000000FC4AC0F8 C0000000FC4AC130 1068 TX 589828 22700 6 0 51 0

資料庫B上:

1) session 表中的 TADDR 欄位有值,是個事務,不過在v$transaction中查詢不到,不過可以在x$ktcxb 中找到

執行 create table action_test1 as select * from tableB@dblink

資料庫A上:

1) v$lock上該程式的鎖有

C0000000FE540D28 C0000000FE540D48 1069 DX 8 0 1 0 0 0

C0000000FCB9FDA8 C0000000FCB9FDE0 1069 TX 196641 20879 6 0 5 0

C0000000FC8356F8 C0000000FC835720 1069 TM 113886 0 3 0 5 0

還發現出現過:

C0000000FE540EF0 C0000000FE540F10 1069 FB 5 21422737 6 0 0 0

資料庫B上:

1) V$lock 中出現:

C0000001380D6860 C0000001380D6880 2897 DX 29 0 4 0 0 0

總結:

使用dblink的時候在本地和遠端資料庫上都會出現DX鎖,是分部式事務用到的,ID1的含義暫時不明,DX鎖的一般都是系統表,到底是鎖的什麼資源,也不知道

問題應該就是遠端資料庫透過dblink取資料,結果網路出問題導致事務一直沒有結束,DX沒有釋放,第2次執行的時候就一直等待DX資源,奇怪的是第2次執行的時候應該申請其他DX資源,為什麼會申請上次出錯的資源呢?

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/133835/viewspace-1004681/,如需轉載,請註明出處,否則將追究法律責任。

相關文章