ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 初次遇见等待事件:enq;tx-row lock contention

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

原创 Linux操作系统 作者:tietouwa 时间:2018-07-30 11:30:42 0 删除 编辑

该事件排在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。


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');————查看是否还存在行级锁。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31547381/viewspace-2168599/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-07-25

  • 博文量
    5
  • 访问量
    3701