enq: TX - row lock contention
# 如果當前正在發生,可以透過下面語句查詢阻塞者: 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 : A 會話持有 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 等待事件enq: TX - row lock contention事件ENQ
- 奇異的enq: TX - row lock contentionENQ
- Oracle Enqueues Wait Events 三 enq: TX - row lock contentionOracleENQAI
- 故障排除 | enq:TX - index contention等待事件ENQIndex事件
- enq: TX - index contention基礎理論ENQIndex
- enq: TX - index contention故障修復一例ENQIndex
- Oracle等待事件之enq: TM – contentionOracle事件ENQ
- oracle等待事件之enq: CF – contentionOracle事件ENQ
- [20220518]enq FU - contention等待事件.txtENQ事件
- enq: TX - allocate ITL entry等待事件分析ENQ事件
- 效能問題,AWR High Event enq: US - contentionENQ
- 關於enq: TX - allocate ITL entry等待事件ENQ事件
- oracle 11.2.0.4 rac叢集等待事件enq: TM - contentionOracle事件ENQ
- ORACLE 如何診斷高水位爭用(enq: HW – contention)OracleENQ
- 故障處理】佇列等待之enq: US - contention案例佇列ENQ
- 【故障處理】佇列等待之enq: US - contention案例佇列ENQ
- [20200120]oracle wait event "enq: SQ – contention" and DBA_DB_LINK_SOURCES.txtOracleAIENQ
- [20231026]enq TX - allocate ITL entry的測試4.txtENQ
- MySQL:Innodb 讓MDL LOCK和ROW LOCK 記錄到errlogMySql
- Oracle優化案例-系統切換引起的enq: SQ - contention(二十八)Oracle優化ENQ
- enq: TM - contention解決之道——外來鍵無索引導致鎖爭用ENQ索引
- 當刪除oracle資料庫user時發生row cache lock 等待事件Oracle資料庫事件
- What is the "WF - Contention'' Enqueue ?ENQ
- ORACLE TX鎖Oracle
- Java TX-LCN:(四)TX-LCN 事務模式Java模式
- Systematic Latch Contention Troubleshooting in OracleOracle
- MySQL裡的found_row()與row_count()MySql
- ORACLE ROW MOVEMENTOracle
- A. Arrow a Row
- RAC中的enq: TS等待ENQ
- TX 面試題目面試題
- MySQL Binlogging Fails With Writing One Row To The Row-based Binary Log FailedMySqlAI
- Oracle TX鎖的處理Oracle
- #1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs
- Lock 鎖
- mysql innodb lock鎖之record lock之一MySql
- flutter佈局-2-rowFlutter
- 623-Add One Row to Tree