Oracle TX锁的处理

来源:这里教程网 时间:2026-03-03 16:24:15 作者:

什么是 T X 锁呢?我们这里简单的说明下:

Oracle 数据库中,当一个事务首次发起一个 DML 语句时就获得一个 TX 锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML 语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后, TX 锁被释放,其他会话才可以加锁。

Oracle 数据库发生 TX 锁等待时,若处理不及时常会引起 Oracle 数据库挂起或死锁,产生 ORA-00060 的错误,导致应用出现长时间未响应、大量事务失败等问题。

下面我们可以简单的模拟一个 T X 锁:

会话 A : 我要对表 zqz .t1 做更新,而且我还故意不提交

SQL> update zqz.t1 set id=2 where id=1;

 

5 rows updated.

会话 B :我对会话 A 的恶行一无所知,我也要去更新表 zq z.t1 的同样的行:

SQL>  update zqz.t1 set id=10086 where id=1;

 

 

 

漫长的等待过后,会话 B 发现,我怎么还没运行完这条 sql ,按道理应该很快的啊???

如何查询到 T X 锁的相关信息

这个时候,我们用以下语句去查询,就会发现数据库出现了个 T X 锁:

select  b.inst_id,

       b.sid,

       b.serial#,

       b.username,

       b.blocking_session,

       b.program,

       b.machine,

       a.sql_id,

       a.sql_text

   from  gv$sql a, gv$session b

  where  a.sql_id = b.sql_id

    and  b.event = 'enq: TX - row lock contention'

    and  a.inst_id = b.inst_id;

 

查询到会话 B 被阻塞了。

我们再使用以下 sql ,可以查询到被锁对象的具体信息:

select  a.inst_id,

       b.owner,

       b.object_name,

       b.object_type,

       a.row_wait_obj#,

       a.row_wait_file#,

       a.row_wait_block#,

       a.row_wait_row#

   from  gv$session a, dba_objects b

  where  a.event = 'enq: TX - row lock contention'

    and  a.row_wait_obj# = b.object_id;

 

 

再再使用以下 sql ,我们可以查询到罪魁祸首的会话信息:

select  a.INST_ID, b.sid, b.serial#, a.spid, a.username, a.program, b.event

   from  gv$process a, gv$session b

  where  a.inst_id = b.inst_id

    and  a.addr = b.paddr

    and  b.sid in  ( select  blocking_session

                    from  gv$session

                   where  event = 'enq: TX - row lock contention' )

 

 

原来内鬼就是会话 id 73 的会话。

如何处理 T X :

接下来你可以选择以下的方法去处理这个会话(在确保不会影响业务的情况下): 1. 用以下 S QL kill 该会话:

alter system kill session'{sid},{serial_id}' immediate;

2. 直接找到这个会话的操作系统进程,直接 kill  -9 杀掉

进程号就是它:

 

相关推荐