首页 > 数据库 > Oracle > Oracle TX锁的处理
什么是 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 锁:
|
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 的会话。
接下来你可以选择以下的方法去处理这个会话(在确保不会影响业务的情况下):
1.
用以下
S
QL
来
kill
该会话:
|
alter system kill session'{sid},{serial_id}' immediate; |
2. 直接找到这个会话的操作系统进程,直接 kill -9 杀掉
进程号就是它:

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