暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Oracle性能优化之'enq: TX - row lock contention'队列等待事件

数据与人 2020-12-15
3318

Oracle性能优化之'enq: TX - row lock contention'队列等待事件


问题背景:
客户反馈系统反应缓慢,协助排查优化

1> 查看问题时段的AWR报告



有队列等待之enq: TX - row lock contention

对应的sql

    DELETE tablename WHERE ID=:B1


    关于等待事件enq: TX - row lock contention :

    通常是Application级别的问题。

    Oracle数据库的等待事件enq: TX - row lock contention会在下列三种情况下会出现。


    1.第一种情况,是真正的业务逻辑上的行锁冲突

    如一条记录被多个人同时修改。

    这种锁对应的请求模式是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. )


      2.第二种情况,是唯一键冲突(In mode 4,唯一索引)

      如主键字段相同的多条记录同时插入。这种锁对应的请求模式是4。

      这也是应用逻辑问题。表上存在唯一索引,A会话插入一个值(未提交),B会话随后也插入同样的值;A会话提交后,enq: TX - row lock contention消失。


      3.第三种情况,是bitmap索引的更新冲突(in mode 4 :bitmap)

      就是多个会话同时更新bitmap索引的同一个数据块。

      源于bitmap的特性:位图索引的一个键值,会指向多行记录,所以更新一行就会把该键值指向的所有行锁定。此时会话请求锁的对应的请求模式是4。

      bitmap索引的物理结构和普通索引一样,也是 B-tree 结构,但它存储的数据记录的逻辑结构为"key_value,start_rowid,end_rowid,bitmap"。
      其内容类似这样:

      "‘8088’,00000000000,10000034441,1001000100001111000"
      Bitmap是一个二进制,表示 START_ROWID 到 END_ROWID 的记录,

      1 表示等于 key_value即‘8088’的 ROWID 记录, 0 则表示不是这个记录。


      在了解bitmap索引的结构之后,我们就能理解同时插入多条记录到拥有bitmap索引的表时,就会同时更新bitmap索引中一个块中的记录,等于某一个记录被同时更新,自然就会出现行锁等待。插入并发量越大,等待越严重。


      4.其他原因
      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.


      解决方案

      如果数据库出现enq: TX - row lock contention等待,

      可以去看v$session和v$session_wait等视图。

      在v$session和v$session_wait中,

      如果看到的event列是enq: TX - row lock contention的,

      就表示这个会话正处于行锁等待。

      该等待事件的请求模式可以从v$session和v$session_wait的p1列中得到。

        select sid,
        chr(bitand(p1, -16777216) 16777215) ||
        chr(bitand(p1, 16711680) 65535) "Name",
        (bitand(p1, 65535)) "Mode"
        from v$session_wait
        where event like 'enq%';
        通过这个SQL可以将p1转换为易阅读的文字。


        AWR报告中sql是个delete语句,查看一下执行计划,是否有索引


          SQL_ID 4ggjbjszghd7x
          --------------------
          DELETE SHAREINNERDOC WHERE SOURCEID=:B1




          Plan hash value: 2749040791
          ----------------------------------------------------------------------------------------------------------------
          | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
          ----------------------------------------------------------------------------------------------------------------
          | 0 | DELETE STATEMENT | | | | 9 (100)| |
          | 1 | DELETE | SHAREINNERDOC | | | | |
          | 2 | TABLE ACCESS BY INDEX ROWID BATCHED| SHAREINNERDOC | 11 | 506 | 9 (0)| 00:00:01 |
          | 3 | INDEX RANGE SCAN | DSHAREINDEXDOC_SOURCEID | 11 | | 3 (0)| 00:00:01 |
          ----------------------------------------------------------------------------------------------------------------


          SQL走的是INDEX RANGE SCAN,索引名称DSHAREINDEXDOC_SOURCEID
          查看索引的类型为FUNCTION-BASED NORMAL

          判断客户队列等待的原因为第二种原因,调整应用逻辑及时commit ,避免A会话删除一个值(未提交),B会话随后也删除同样的值;A会话提交后,enq: TX - row lock contention消失。




          往期回顾


          Oracle性能优化之基于advisor优化工具的一次sql优化
          Oracle性能优化之advisor调优工具优化sql(基于sql_id)
          Oracle性能优化之'cursor: pin S'等待事件


          客官长按关注

          吾辈自强不息

          文章转载自数据与人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论