ORACLE锁机制初步研究

8 views
Skip to first unread message

Lian...@gmail.com

unread,
May 11, 2008, 1:44:39 PM5/11/08
to Liant's Oracle Note
  经过两天的试验,对ORACLE的锁机制有了一定了解。
  ORACLE的Lock按锁定的对象分为Table Lock(TM)和Row Lock(TX),按锁的等级则分为ROW SHARE
MODE(RS)、ROW EXCLUSIVE MODE(RX)、SHARE MODE(S)、SHARE ROW EXCLUSIVE
MODE(SRX)、EXCLUSIVE MODE(X)。
  经过试验,发觉在10g上,所有的DML语句以及SELECT .. FOR UPDATE都会先加一个RX的TM,然后再对需要锁定的行加上X的
TX,而并不是像官方文档所说的,SELECT .. FOR UPDATE会加一个RS的TM。由于RX锁互不排斥,所以INSERT语句通常不会产
生死锁,但是有两种情况例外,一种是itl deadlock,这个情况比较复杂,另一个是主键冲突导致(当两个SESSION插入相同键值,其中一个
会出现enq: TX - row lock contention等待事件,且通过V$LOCK视图可以查看到被BLOCK的INSERT语句已经申
请到了RX的TM和X的TX,但是额外还申请了一个在另一个会话插入的记录上的S的TX,正是由于S和X互斥,所以出现等待,有等待就有了死锁的可能
性)。
  关于锁转换(ORALCE无类似DB2的锁升级),我总结出来的基本的法则是:比较拥有的锁与申请的锁的并发性,拥有的锁转换为并发性高的锁,但是
有个例外情况,当拥有S锁时,如果申请RX锁,则将转换为SRX锁,其实这也很容易理解,SRX锁就是既有S锁的功能又有RX锁的功能。
Reply all
Reply to author
Forward
0 new messages