Oracle TX鎖的處理

ZQqzz發表於2021-01-26

什麼是 T X 鎖呢?我們這裡簡單的說明下:

Oracle 資料庫中,當一個事務首次發起一個 DML 語句時就獲得一個 TX 鎖,該鎖保持到事務被提交或回滾。當兩個或多個會話在表的同一條記錄上執行 DML 語句時,第一個會話在該條記錄上加鎖,其他的會話處於等待狀態。當第一個會話提交後, TX 鎖被釋放,其他會話才可以加鎖。

Oracle 資料庫發生 TX 鎖等待時,若處理不及時常會引起 Oracle 資料庫掛起或死鎖,產生 ORA-00060 的錯誤,導致應用出現長時間未響應、大量事務失敗等問題。


下面我們可以簡單的模擬一個 T X 鎖:

會話 A : 我要對錶 zqz .t1 做更新,而且我還故意不提交

SQL> update zqz.t1 set id=2 where id=1;

 

5 rows updated.

會話 B :我對會話 A 的惡行一無所知,我也要去更新表 zq z.t1 的同樣的行:

SQL>  update zqz.t1 set id=10086 where id=1;

 

 

 

漫長的等待過後,會話 B 發現,我怎麼還沒執行完這條 sql ,按道理應該很快的啊???

如何查詢到 T X 鎖的相關資訊

這個時候,我們用以下語句去查詢,就會發現資料庫出現了個 T X 鎖:

select  b.inst_id,

       b.sid,

       b.serial#,

       b.username,

       b.blocking_session,

       b.program,

       b.machine,

       a.sql_id,

       a.sql_text

   from  gv$sql a, gv$session b

  where  a.sql_id = b.sql_id

    and  b.event = 'enq: TX - row lock contention'

    and  a.inst_id = b.inst_id;

 

查詢到會話 B 被阻塞了。

我們再使用以下 sql ,可以查詢到被鎖物件的具體資訊:

select  a.inst_id,

       b.owner,

       b.object_name,

       b.object_type,

       a.row_wait_obj#,

       a.row_wait_file#,

       a.row_wait_block#,

       a.row_wait_row#

   from  gv$session a, dba_objects b

  where  a.event = 'enq: TX - row lock contention'

    and  a.row_wait_obj# = b.object_id;

 

 

再再使用以下 sql ,我們可以查詢到罪魁禍首的會話資訊:

select  a.INST_ID, b.sid, b.serial#, a.spid, a.username, a.program, b.event

   from  gv$process a, gv$session b

  where  a.inst_id = b.inst_id

    and  a.addr = b.paddr

    and  b.sid in  ( select  blocking_session

                    from  gv$session

                   where  event = 'enq: TX - row lock contention' )

 

 

原來內鬼就是會話 id 73 的會話。

如何處理 T X :

接下來你可以選擇以下的方法去處理這個會話(在確保不會影響業務的情況下):
1. 用以下 S QL kill 該會話:

alter system kill session'{sid},{serial_id}' immediate;

2. 直接找到這個會話的作業系統程式,直接 kill  -9 殺掉

程式號就是它:

 


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

相關文章