Oracle中TX锁(行锁)监控,抓TX锁的源头

Posted robinson1988

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle中TX锁(行锁)监控,抓TX锁的源头相关的知识,希望对你有一定的参考价值。

各位DBA,看到这篇文章是不是很开心,解决了你一个大麻烦,赶紧把它部署到实时监控程序吧

(咳咳,转载,抄袭不注明文章出处的人可耻哈)

session 1: update emp_bak set ename='沙雕' where empno=7369;

session 2: update emp_bak set ename='大长腿' where empno=7369;

session 3: update emp_bak set ename='矮丑穷' where empno=7369;

运行下面脚本可以抓到哪个SID,哪个SQL_ID,跑的SQL_TEXT锁住了哪个SID,哪个SQL_ID,哪个SQL语句

需要注意的是:如果V$SQLAREA没有保存SQL,可能抓不到,其次,如果系统并发很高,你可能需要再修改下脚本

select sysdate,
       source_sid,
       source_sql_id,
       source_sql_text,
       blocking_sid,
       blocking_sql_id,
       blocking_sql_text
  from (select b.sid source_sid,
               d.sql_id source_sql_id,
               d.sql_text source_sql_text,
               a.sid blocking_sid,
               a.sql_id blocking_sql_id,
               e.sql_text blocking_sql_text,
               (select object_name
                  from dba_objects
                 where object_id = a.row_wait_obj#) object_name
          from v$session     a,
               v$session     b,
               v$transaction c,
               v$sqlarea     d,
               v$sqlarea     e
         where a.event = 'enq: TX - row lock contention'
           and a.blocking_session = b.sid
           and b.taddr = c.addr
           and to_date(c.start_time, 'mm/dd/yy hh24:mi:ss') =
               d.last_active_time
           ---and d.command_type in (2, 3, 6)
           and b.user# = d.parsing_schema_id
           and a.sql_id = e.sql_id)
 where instr(upper(source_sql_text), object_name) > 0;

脚本运行示例:

SQL> select sysdate,
  2         source_sid,
  3         source_sql_id,
  4         source_sql_text,
  5         blocking_sid,
  6         blocking_sql_id,
  7         blocking_sql_text
  8    from (select b.sid source_sid,
  9                 d.sql_id source_sql_id,
 10                 d.sql_text source_sql_text,
 11                 a.sid blocking_sid,
 12                 a.sql_id blocking_sql_id,
 13                 e.sql_text blocking_sql_text,
 14                 (select object_name
 15                    from dba_objects
 16                   where object_id = a.row_wait_obj#) object_name
 17            from v$session     a,
 18                 v$session     b,
 19                 v$transaction c,
 20                 v$sqlarea     d,
 21                 v$sqlarea     e
 22           where a.event = 'enq: TX - row lock contention'
 23             and a.blocking_session = b.sid
 24             and b.taddr = c.addr
 25             and to_date(c.start_time, 'mm/dd/yy hh24:mi:ss') =
 26                 d.last_active_time
 27             ---and d.command_type in (2, 3, 6)
 28             and b.user# = d.parsing_schema_id
 29             and a.sql_id = e.sql_id)
 30   where instr(upper(source_sql_text), object_name) > 0;
 
SYSDATE     SOURCE_SID SOURCE_SQL_ID SOURCE_SQL_TEXT                                  BLOCKING_SID BLOCKING_SQL_ID BLOCKING_SQL_TEXT
----------- ---------- ------------- ------------------------------------------------ ------------ --------------- ------------------------------------------------
2020/5/19 1        192 201c4xcdsjaj0  update emp_bak set ename='沙雕' where empno=7369            4 2hpm4yjuut7cg    update emp_bak set ename='矮丑穷' where empno=7369
 
2020/5/19 1        192 201c4xcdsjaj0  update emp_bak set ename='沙雕' where empno=7369          221 36xb1pyv12k56    update emp_bak set ename='大长腿' where empno=7369
 

 

以上是关于Oracle中TX锁(行锁)监控,抓TX锁的源头的主要内容,如果未能解决你的问题,请参考以下文章

oracle有关锁的命令

Oracle TM锁和TX锁

oracle常用的动态视图

ORACLE的TM锁和TX锁

Oracle管理数据的并发

Oracle锁