该事件排在top 10的第二位,也就是说系统中在这1小时里出现了严重的行级锁等待事件。
产生这种等待事件的原因有以下几种:
1、不同的session更新或删除同一条记录;
2、唯一索引有重复索引;
3、位图索引同时被更新或同时并发的向位图索引字段上插入相同的字段值;
4、并发的对同一个数据块上的数据进行update操作;
5、等待索引块分裂完成
分析:
可在AWR中的segment by row lock waits章节中看到 row lock waits发生在一个表上,并且在sql order by Elapsed time中排在第一位的sql是一个DML(update)语句,仅60分钟共执行了925次。所以考虑原因应是并发的对同一数据块上的数据进行update操作所导致的。
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');————查看是否还存在行级锁。