Oracle中的锁(LOCK)机制(七)

2014-11-24 15:37:55 · 作者: · 浏览: 11
able tun2_tab in SHARE ROW EXCLUSIVE MODE ;

Table(s)Locked.

dexter@STARTREK>commit;

Commitcomplete.

dexter@STARTREK>lock table tun2_tab in EXCLUSIVE MODE ;

waiting ...

看一下锁的情况

sys@STARTREK>@lock

SID TY ID1 LMODE REQUEST BLOCK

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

35 TM 76917 2 0 1

160 TM 76917 0 6 0

RS|SS锁和X锁是不能并发的,但是可以兼容其他类型的锁。

Row Exclusive TableLock (RX|SX)

Also called a subexclusive table lock (SX)

Session1 session_id=35 :

dexter@STARTREK>lock table tun2_tab in ROW EXCLUSIVE mode ;

Table(s)Locked.

Session2 session_id=160:

dexter@STARTREK>lock table tun2_tab in ROW SHARE mode ;

Table(s)Locked.

dexter@STARTREK>commit ;

Commitcomplete.

dexter@STARTREK>lock table tun2_tab in ROW EXCLUSIVE mode ;

Table(s)Locked.

dexter@STARTREK>commit ;

Commitcomplete.

dexter@STARTREK>lock table tun2_tab in SHARE MODE ;

waiting ...

看一下锁的情况

sys@STARTREK>/

SID TY ID1 LMODE REQUEST BLOCK

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

35 TM 76917 3 0 1

160 TM 76917 0 4 0

RX|SX 与 S 锁是无法并发的,经测试SRX|SSX锁也一样无法与RX|SX锁并发。

Share Table Lock(S)

Session1 session_id=35 :

dexter@STARTREK>lock table tun2_tab in SHARE MODE ;

Table(s)Locked.

Session2 session_id=160:

dexter@STARTREK>lock table tun2_tab in ROW SHARE mode ;

Table(s)Locked.

dexter@STARTREK>commit ;

Commitcomplete.

dexter@STARTREK>lock table tun2_tab in ROW EXCLUSIVE mode ;

waiting ...

锁情况:

sys@STARTREK>/

SID TY ID1 LMODE REQUEST BLOCK

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

35 TM 76917 4 0 1

160 TM 76917 0 3 0

S 锁比较特殊,它不允许与RX|SX 也就是3级锁并发,但是允许多个S锁并发的在多个事务中持有。

例如两个sessoin同时执行下面的命令

locktable tun2_tab in SHARE MODE ;

可以看到下面的lock信息:

sys@STARTREK>/

SID TY ID1 LMODE REQUEST BLOCK

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

35 TM 76917 4 0 0

129 TM 76917 4 0 0

但是S锁无法与SRX|SSX和X锁并发。

Share Row ExclusiveTable Lock (SRX|SSX)

Also called a share-subexclusive table lock (SSX)

Session1 session_id=35 :

dexter@STARTREK>lock table tun2_tab in SHARE ROW EXCLUSIVE MODE ;

Table(s)Locked.

Session2 session_id=129:

dexter@STARTREK>lock table tun2_tab in ROW SHARE mode ;

Table(s)Locked.

dexter@STARTREK>commit ;

Commitcomplete.

dexter@STARTREK>lock table tun2_tab in ROW EXCLUSIVE mode ;

waiting ...

锁情况:

sys@STARTREK>@lock

SID TY ID1 LMODE REQUEST BLOCK

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

35 TM 76917 5 0 1

129 TM 76917 0 3 0

SRX|SSX锁无法与RX|SX以上的锁并发持有。

Exclusive Table Lock(X)

Session1 session_id=35 :

dexter@STARTREK>lock table tun2_tab in EXCLUSIVE MODE ;

Table(s)Locked.

Session2 session_id=129:

dexter@STARTREK>lock table tun2_tab in ROW SHARE mode ;

waiting ...

X锁无法与任何锁并发。

上面的内容笔者已经使用PLSQL模拟出来,详情见附录1

下面列举几种常用操作的加锁情况,是否会因为table lock发生阻塞,只要代入表中即可。

RS|SS

RX|SX

S

SRX|SSX

X

RS|SS

×

RX|SX

×

×

×

S

×

×

×

SRX|SSX

×

×

×

×

X

×

×

×

×

×

insert /*+ append_values */ into values

X

insert /*+ append */ into select

X

insert into values

RX

insert into select

RX

sql*ldr Conventional

RX

sql*ldr append

X

sql*ldr append+parallel

S

update

RX

delete

RX

select for update

RX

4.导致死锁的SQL示例。

下面给出一个最简单的示例。

_dexter@FAKE>select * from a ;

X

----------

1

2

_dexter@FAKE>select * from b ;

X

----------

1

2

s1 t1:

_dexter@FAKE>update b set x=3 where x= 1 ;

1 rowupdated.

s2 t2:

_dexter@FAKE>update a set x=3 where x=1 ;

1 rowupdated.