|
晕了又晕, 想了又想, 学习了, 呵呵.
我发现select for update和update加的表级锁是一样的, 而不是几位朋友所说的select for update加rs锁, update加rx锁. 我用的10.2版本.
session1:
[PHP]
SQL> select * from a where x=1 for update;
X
----------
1
[/PHP]
session2:
[PHP] SQL> select a.* from v$lock a, v$lock_type b where a.type=b.type and b.is_user='YES';
ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- --- ---- ---------- ---------- ---------- ---------- ---------- ----------
270F3A90 270F3AA8 142 TM 11190 0 3 0 108 0
271431E0 271432FC 142 TX 196628 264 6 0 108 0 [/PHP]
session1 先rollback了:
[PHP]SQL> update a set x=2 where x=1;[/PHP]
session2:
[PHP]SQL> select a.* from v$lock a, v$lock_type b where a.type=b.type and b.is_user='YES';
ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- --- ---- ---------- ---------- ---------- ---------- ---------- ----------
270F3A90 270F3AA8 142 TM 11190 0 3 0 57 0
271431E0 271432FC 142 TX 131085 263 6 0 57 0
[/PHP]
对于表级的share锁我也试了一下, 外键如果没有加索引, update了字表, 然后另一个会话里update父表的pk, 这个update会申请rs锁和share锁, 会被阻塞.
[PHP]ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- --- ---- ---------- ---------- ---------- ---------- ---------- ----------
270F3A90 270F3AA8 142 TM 11760 0 3 0 30 1
270F3B3C 270F3B54 143 TM 11757 0 3 0 12 0
270F3BE8 270F3C00 143 TM 11760 0 0 4 12 0
271431E0 271432FC 142 TX 262170 267 6 0 30 0
[/PHP] |
|