【IT168 技术文档】
本文给出与TX锁等待有关的几个例子。一般情况下,这些等待并不显著,除非它们运行的时间特别长,或者导致死锁(ORA-60错误)。本文给出的例子面向应用人员和DBA。例子的测试环境需要对V$视图的select权限。
1. 有用的sql语句
如果遇到一个锁相关的hang的情形,可以使用下述语句,来帮助我们找出waiters和blockers:
显示等待锁的所有会话:
select event,p1,p2,p3 from v$session_wait
where wait_time=0 and event='enqueue';
显示等待TX锁的所有会话:
select * from v$lock where type='TX' and request>0;
显示持有TX锁的所有会话:
select * from v$lock where type='TX' and lmode>0;
2. 什么是TX锁
当一个事务开始首次更改的时候,要求持有TX锁,直到事务执行一个COMMIT 或者 ROLLBACK。它利用的是排队机制,其他的会话只能等待此事务结束。
TX锁的名称(ID1 和 ID2)反映了活动事务ID。
3. 例子
使用下面的表来说明问题:
以SCOTT/TIGER身份或者其他的测试用户连接数据库,并搭建好测试环境:
DROP TABLE tx_eg;
CREATE TABLE tx_eg ( num number, txt varchar2(10), sex varchar2(10) )
INITRANS 1 MAXTRANS 2;
INSERT into tx_eg VALUES ( 1, 'First','FEMALE' );
INSERT into tx_eg VALUES ( 2, 'Second','MALE' );
INSERT into tx_eg VALUES ( 3, 'Third','MALE' );
INSERT into tx_eg VALUES ( 4, 'Fourth','MALE' );
INSERT into tx_eg VALUES ( 5, 'Fifth','MALE' );
COMMIT;
在本例中,要求4个会话:
Ses#1 表TX_EG用户的第一个会话
Ses#2 表TX_EG用户的第二个会话
Ses#3 表TX_EG用户的第三个会话
DBA SYSDBA用户,能访问
例子涵盖下述情形:
行被一个活动事务锁定
唯一性约束或者主键约束
块头中的事务槽不够
同一位图索引涉及到多行