select for update_v$lock_dml小測試(鎖型別及模式)

wisdomone1發表於2010-08-15

SQL> select kaddr,sid,type,id1,id2,decode(lmode,0,'none',1,'null',2,'row-share',3,'row-exclusive',4,'share',5,'share row exclusive',6,'exclusive') lmode,
            decode(request,0,'none',1,'null',2,'row-share',3,'row-exclusive',4,'share',5,'share row exclusive',6,'exclusive') request,block
     from v$lock where sid in(149,145) order by 2;

KADDR                   SID TY        ID1        ID2 LMODE                  REQUEST
---------------- ---------- -- ---------- ---------- ------------------- ----------  --id1及id2含義取決於鎖的型別,lmode為持鎖型別或叫模式,共有6種型別,請求鎖模式同理,type為鎖型別:分為使用者鎖和系統鎖,此外

我們是使用者鎖,具體請查閱官方手冊
00000000703B8758        149 TM      51356          0 row-exclusive                0
00000000704A7788        149 TX      65581        299 none                         6
000000006F4A76E0        159 TX      65581        299 exclusive                    0
00000000703B8658        159 TM      51356          0 row-exclusive                0


--搞清所有鎖型別及鎖模式的含義及作用
--id1及id2的含義


SQL> select * from test where deptno in(10,20,30) for update; --持鎖會話

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO

SQL> select distinct sid from v$mystat;

       SID
----------
       159

SQL>

 

SQL> update test set dname='x' where deptno=30; ---請求鎖會話

 

 

SQL> update test set deptno=88;--145 會話,持鎖會話

6 rows updated.

 

SQL> create index idx_test on test(deptno);--149會話,請求鎖會話(select for update同理),注:select * from test nowait,nowait用於dml語句請求鎖資源是否馬上向客戶端返回提示錯誤資訊(如:資源正忙之類)
create index idx_test on test(deptno)
                         *
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified

 

SQL> /  

KADDR                   SID TY        ID1        ID2 LMODE               REQUEST                  BLOCK
---------------- ---------- -- ---------- ---------- ------------------- ------------------- ----------
000000006F466990        145 TX     327701        310 exclusive           none                         0   --block=1表示持鎖會話,block=0為非持鎖會話

 


小結:
       select for update會形成排它鎖及行級排它鎖(tx及tm鎖),且會阻塞其它dml及create|drop index相關動作
       select for date及dml不會阻塞dbms_stats收集統計資訊動作

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

相關文章