技术开发 频道

产生TX锁等待不同情形的分析

  【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用户,能访问

  例子涵盖下述情形:

   行被一个活动事务锁定

   唯一性约束或者主键约束

   块头中的事务槽不够

   同一位图索引涉及到多行

0
相关文章