# 如果当前正在发生,可以通过下面语句查询阻塞者: 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.
( https://forums.oracle.com/forums/thread.jspa?threadID=860488 )
截取自: https://yq.aliyun.com/articles/283856/
