技术开发 频道

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

  6. 块中的事务槽不够

  Oracle利用每个数据块中的头部信息,来标识哪些事务锁定了哪些行,这就是'interested transaction list'

  一个对象中的事务的ITL数量,由属性INITRANS 和 MAXTRANS控制。INITRANS是初始事务槽数量。MAXTRANS是允许的最多的事务槽数量。每个想要修改块的事务,都需要占用块的一个'ITL'。

  MAXTRANS决定了在一个块中,最大活动的并发事务数。

  INITRANS 为最小的并发事务数。如果要求的事务数介于INITRANS和MAXTRANS,ITL会自动扩展,前提是在块的头部还有足够的剩余空间,用于存放扩展ITL的信息。

  如果没有可用的'ITL',那么会话就会以模式4等待一个活动事务的TX锁。

  例如:

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

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

  Ses#3: update tx_eg set txt='Different' where num=3;

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

  from v$lock where type='TX';

  SID TY ID1 ID2 LMODE REQUEST

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

  8 TX 655367 560 6 0

  10 TX 655367 560 0 4

  12 TX 458799 551 6 0

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

  Ses#1: commit;

  Ses#2: commit;

  Ses#3: commit;

  Ses#1: ALTER TABLE tx_eg MAXTRANS 3;

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

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

  Ses#3: update tx_eg set txt='Different' where num=3;

  三行都可以更新,因为有可用的空间用于ITL列表进行增长,以满足三个事务的要求。

  Ses#1: commit;

  Ses#2: commit;

  Ses#3: commit;

  从9.2开始,可以使用v$segment_statistics来检查ITL等待:

  SELECT t.OWNER, t.OBJECT_NAME, t.OBJECT_TYPE, t.STATISTIC_NAME, t.VALUE

  FROM v$segment_statistics t

  WHERE t.STATISTIC_NAME = 'ITL waits'

  AND t.VALUE > 0;

  OWNER OBJECT_NAME OBJECT_TYPE STATISTIC_NAME VALUE

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

  HR TX_EG TABLE ITL waits 1

  必要时,可以增大INITTRANS 和 MAXTRANS

  7. 同一位图索引涉及到多行

  位图的键值对应一个范围内的ROWID。每个位图索引的入口可能对应实际表中的多行。

  如果两个会话希望更新同一个位图索引片段对应的行,那么第二个会话就会以共享模式等待TX锁,直到第一个会话提交或者回滚。

  例如:

  Ses#1: CREATE Bitmap Index tx_eg_bitmap on tx_eg ( sex );

  Ses#1: update tx_eg set sex='FEMALE' where num=3;

  Ses#2: update tx_eg set sex='FEMALE' where num=4;

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

  from v$lock where type='TX';

  SID TY ID1 ID2 LMODE REQUEST

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

  8 TX 262151 62 6 0

  10 TX 327680 60 6 0

  10 TX 262151 62 0 4

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

  Ses#1: commit;

  Ses#2: commit;

  8. 其他情形

  其他情形比较少见。

0
相关文章