主從表,增,刪,改操作時產生的鎖演示

freshairpeng發表於2014-04-02
主從表,增,刪,改操作時產生的鎖演示

SQL> create table p(id int primary key);

表已建立。

SQL> create table c(id references p(id));

表已建立。

SQL> desc p;
 名稱                                      是否為空? 型別
 ----------------------------------------- -------- ---------------------------

 ID                                        NOT NULL NUMBER(38)

SQL> desc c;
 名稱                                      是否為空? 型別
 ----------------------------------------- -------- ---------------------------

 ID                                                 NUMBER(38)

SQL> insert into p values(1);

已建立 1 行。

SQL> commit;

提交完成。

SQL> update p set id=1 where id=1;

已更新 1 行。

SQL> commit;

提交完成。

SQL> delete from p where id=1;

已刪除 1 行。

SQL> rollback;

回退已完成。

SQL> select * from p;

        ID
----------
         1

SQL> insert into c values(1);

已建立 1 行。

SQL> commit;

提交完成。

SQL> update c set id=1 where id=1;

已更新 1 行。

SQL> commit;

提交完成。

SQL> delete from c where id=1;

已刪除 1 行。

SQL> rollback;

回退已完成。

 
對應在主,從表上進行新增,修改,刪除操作時,在主,從表上產生的表鎖,行鎖具體情況如下:

SQL> conn scott/tiger
已連線。
SQL> select sid,type,id1,id2,lmode,request,block from sys.v$lock where type in (
'TM','TX');

SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM'
,'TX');

       SID TYPE        ID1        ID2      LMODE    REQUEST      BLOCK
---------- ---- ---------- ---------- ---------- ---------- ----------
        72 TM        73901          0          3          0          0
        72 TM        73903          0          3          0          0
        72 TX       655362        730          6          0          0

SQL> select object_name from dba_objects where object_id in (73901,73903);

OBJECT_NAME
--------------------------------------------------------------------------------

P
C

SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM'
,'TX');

未選定行

SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM'
,'TX');

       SID TYPE        ID1        ID2      LMODE    REQUEST      BLOCK
---------- ---- ---------- ---------- ---------- ---------- ----------
        72 TM        73901          0          3          0          0
        72 TX       262162        736          6          0          0

SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM'
,'TX');

       SID TYPE        ID1        ID2      LMODE    REQUEST      BLOCK
---------- ---- ---------- ---------- ---------- ---------- ----------
        72 TM        73901          0          3          0          0
        72 TX        65550        732          6          0          0

SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM'
,'TX');

未選定行

SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM'
,'TX');

       SID TYPE        ID1        ID2      LMODE    REQUEST      BLOCK
---------- ---- ---------- ---------- ---------- ---------- ----------
        72 TM        73901          0          3          0          0
        72 TM        73903          0          3          0          0
        72 TX       393217        951          6          0          0

SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM'
,'TX');

未選定行

SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM'
,'TX');

       SID TYPE        ID1        ID2      LMODE    REQUEST      BLOCK
---------- ---- ---------- ---------- ---------- ---------- ----------
        72 TM        73901          0          3          0          0
        72 TM        73903          0          3          0          0
        72 TX       131097        903          6          0          0

SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM'
,'TX');

未選定行

SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM'
,'TX');

       SID TYPE        ID1        ID2      LMODE    REQUEST      BLOCK
---------- ---- ---------- ---------- ---------- ---------- ----------
        72 TM        73901          0          3          0          0
        72 TM        73903          0          3          0          0
        72 TX       262155        736          6          0          0

SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM'
,'TX');

未選定行

結論:
1:在主表上進行insert 操作時,會在主從,表上增加一個表瑣,以及在主表上增加一個行鎖。
2:在主表上進行update,delete操作時,會在主表上增加一個表鎖,但是從表上不會增加表鎖,相應主表上也會增加一個行鎖。
3:在從表上進行insert,update,delete操作時,會在主從,表上增加一個表瑣,以及在從表上增加一個行鎖。
具體為啥會這樣,我也還沒搞清楚,歡迎大家一起討論,哈哈。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14766526/viewspace-1134555/,如需轉載,請註明出處,否則將追究法律責任。

相關文章