什么是 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 杀掉
进程号就是它:
