初次遇见等待事件:enq;tx-row lock contention

初次遇见等待事件:enq;tx-row lock contention_第1张图片

该事件排在top 10的第二位,也就是说系统中在这1小时里出现了严重的行级锁等待事件。

产生这种等待事件的原因有以下几种:

           1、不同的session更新或删除同一条记录;

           2、唯一索引有重复索引;

           3、位图索引同时被更新或同时并发的向位图索引字段上插入相同的字段值;

           4、并发的对同一个数据块上的数据进行update操作;

           5、等待索引块分裂完成

分析:

初次遇见等待事件:enq;tx-row lock contention_第2张图片

          可在AWR中的segment by row lock waits章节中看到 row lock waits发生在一个表上,并且在sql order by Elapsed time中排在第一位的sql是一个DML(update)语句,仅60分钟共执行了925次。所以考虑原因应是并发的对同一数据块上的数据进行update操作所导致的。

初次遇见等待事件:enq;tx-row lock contention_第3张图片

             Sql id : g8vj3a677p9c1

             Sql:

            /* update dao.storage.model.DynamicInventoryQuantity */ update wxdms.BJM12 set BJZWMC=:1 , JJCKDM=:2 , JJCKID=:3 , JJCKJC=:4 , JJDSRQ=:5 , JJDSSJ=:6 , JJKZDM=:7 , JJKZID=:8 , JJKZJC=:9 , JJSLDM=:10 , JJSLID=:11 , JJSLLX=:12 , JJWPSL=:13 , WXGYBM=:14 , WXGYID=:15 , WXPJDM=:16 , WXPJID=:17 , XTCZRQ=:18 , XTCZRY=:19 , XTCZSJ=:20 , JJSLMC=:21 , KCPPAI=:22 , KCPPMC=:23 where JJDTID=:24

 解决方法:     

SQL> select sid,serial#,p1,event,blocking_instance,blocking_session from v$session where sql_id='g8vj3a677p9c1';————可根据sql id查看相对应的sid。

SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in('TX','TM');————查找出ID1列=事务槽号相同的sid。

LMODE 6  代表持有锁的会话,REQUEST请求被阻塞6,代表被阻塞,  如何判断谁阻塞谁,通过ID1列=事物槽号相同,代表是同一行的数据

SQL> select sid,sql_id,serial#,p1,event,blocking_instance,blocking_session from v$session where sid in(XX,XX)————查看会话及行级锁的相关信息。

SQL> alter system kill session 'XX,XX';————kill 阻塞的会话。

SQL> select sid,sql_id,serial#,p1,event,blocking_instance,blocking_session from v$session where sid in(XX,XX)————再次查看会话信息。

SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in('TX','TM');————查看是否还存在行级锁。

你可能感兴趣的:(初次遇见等待事件:enq;tx-row lock contention)