enq: TX - row lock contention

你好我是李白發表於2020-05-29

# 如果當前正在發生,可以透過下面語句查詢阻塞者:
col p2 for 9999999999
col p3 for 9999999999
col blk_sid for 99999
col lv for 99
set lines 160
set pagesize 100
select sid,blocking_session final_sid,sql_id,prev_sql_id,event,level lv,p2,p3,sys_connect_by_path(sid,',') sid_chain
        from v$session     
            start with event = 'enq: TX - row lock contention'
            connect by sid = prior blocking_session 
        order by level;
# 如果過去發生,可以透過AWR、ASH定位相關表、索引發生的row lock contention
# 可以根據enq: TX - row lock contention的p1或者根據p2 p3關聯v$lock id1 id2來查詢鎖模式:
select chr(bitand(&p1, -16777216) / 16777215) ||
       chr(bitand(&p1, 16711680) / 65535) "Name",
       (bitand(&p1, 65535)) "Mode"
  from dual;
# 根據lock mode來獲取是否是真正的行鎖,還是由於索引,主鍵唯一鍵衝突導致。



所有以 enq: ”打頭的等待事件都表示這個會話正在等待另一個會話持有的內部鎖釋放,它的名稱格式是 enq:enqueue_type - related_details 。這裡的 enqueue_type TX related_details row lock contention 。資料庫動態效能檢視 v$event_name 提供所有以“ enq: ”開頭的等待事件的列表。

Oracle  enqueue  包含以下模式:

模式程式碼

解釋

1

Null mode

2

Sub-Share

3

Sub-Exclusive

4

Share

5

Share/Sub-Exclusive

6

Exclusive

 

enq: TX - row lock contention 通常是 Application 級別的問題。通常情況下, Oracle 資料庫的等待事件 enq: TX - row lock contention 會在下列三種情況下會出現。

(一) 第一種情況,是 真正的業務邏輯上的行鎖衝突 ,如一條記錄被多個人同時修改。這種鎖對應的請求模式是6( Waits for TX in mode 6  會話持有 row level lock B 會話等待這個 lock 釋放。)。 不同的 session 更新或刪除同一個記錄。( This occurs when one application is updating or deleting a row that another session is also trying to update or delete. 

解決辦法:持有鎖的會話 commit 或者 rollback

(二) 第二種情況,是 唯一鍵衝突(In mode 4,唯一索引) ,如主鍵欄位相同的多條記錄同時插入。這種鎖對應的請求模式是4。這也是應用邏輯問題。表上存在唯一索引, A 會話插入一個值(未提交), B 會話隨後也插入同樣的值 ;A 會話提交後, enq: TX - row lock contention 消失。

解決辦法:持有鎖的會話 commit 或者 rollback

(三) 第三種情況,是 bitmap索引的更新衝突( in mode 4 :bitmap ,就是多個會話同時更新bitmap索引的同一個資料塊。源於 bitmap 的特性:點陣圖索引的一個鍵值,會指向多行記錄,所以更新一行就會把該鍵值指向的所有行鎖定。此時會話請求鎖的對應的請求模式是 4

解決辦法:持有鎖的會話 commit 或者 rollback

(四) 其他 原因

It could be a primary key problem;  a trigger firing attempting to insert, delete, or update a row; a problem with initrans; waiting for an index split to complete; problems with bitmap indexes;updating a row already updated by another session; or something else.




擷取自:

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

相關文章