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.