技术开发 频道

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

  4. 行被一个活动事务锁定

  当一个会话更新表中的行的时候,该行会被会话的事务锁定。其他用户可能会使用select查询此行,但是看到的是在更新前的行。如果另外一个会话也希望更新此行,它必须等待第一个会话提交或回滚。第二个会话以独占模式,等待第一个会话释放占用的TX锁。

  例如:

  Ses#1: update tx_eg set txt='Garbage' where num=1;

  Ses#2: update tx_eg set txt='Garbage' where num=1;

  DBA: select SID,TYPE,ID1,ID2,LMODE,REQUEST

  from v$lock where type='TX';

  SID TY ID1 ID2 LMODE REQUEST

  ---------- -- ---------- ---------- ---------- ----------

  8 TX 131075 597 6 0

  10 TX 131075 597 0 6

   SID 10等待TX SID 8持有的TX锁,并且希望以独占模式占有此TX锁 (as REQUEST=6)。

  下面的查询,演示了当出现一个TX锁等待的时候,在V$SESSION_WAIT中显示一个'enqueue',P1RAW, P2 和 P3显示了实际的被等待的锁。当使用并行服务器,event是'DFS enqueue lock acquisition',而不是'enqueue'。

  DBA: select sid,p1raw, p2, p3

  from v$session_wait

  where wait_time=0 and event='enqueue';

  SID P1RAW P2 P3

  ---------- -------- ---------- ----------

  10 54580006 131075 597

  > ~~~~ ~~ ~~~~~~ ~~~

  > type|mode id1 id2

  > T X 6 131075 597

  另一个查询显示object_id和会话等待的具体行。该信息在V$SESSION中仅仅当会话等待是行级锁才有效。该查询从Oracle 7.3开始可用。上述示例中,SID 10是等待者:

  DBA: select ROW_WAIT_OBJ#,

  ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#

  from v$session

  where sid=10;

  ROW_WAIT_O ROW_WAIT_F ROW_WAIT_B ROW_WAIT_R

  ---------- ---------- ---------- ----------

  3058 4 2683 0

  > 等待者正在等待一个TX 锁,它锁定文件4中的2683块中的第0行,对象号是3058.

  Ses#1: rollback;

  Ses#2: rollback;

  5. 唯一性约束或者主键约束

  如果一个表有主键约束,或者唯一性约束,或者唯一性索引,那么该约束引用的列的唯一性由唯一性索引启用。如果两个会话想插入同一个键值,第二个会话必须等待,以便知道是否会产生ORA-0001错误。

  例如:

  Ses#1: ALTER TABLE tx_eg ADD CONSTRAINT tx_eg_pk PRIMARY KEY( num );

  Ses#1: insert into tx_eg values (10,'New','MALE');

  Ses#2: insert into tx_eg values (10,'OtherNew',null);

  DBA: select SID,TYPE,ID1,ID2,LMODE,REQUEST

  from v$lock where type='TX';

  SID TY ID1 ID2 LMODE REQUEST

  ---------- -- ---------- ---------- ---------- ----------

  8 TX 196625 39 6 0

  10 TX 262155 65 6 0

  10 TX 196625 39 0 4

  SID 10等待SID 8持有的TX锁,并想将此锁置于共享模式(REQUEST=4)。SID 10事务本身持有一个TX锁。

  Ses#1: commit;

  Ses#2: ORA-00001: unique constraint (SCOTT.TX_EG_PK) violated

  Ses#2: rollback;

0
相关文章