Oracle LOCK內部機制及最佳實踐系列(三)構想一個使用手工鎖定解決一種業務需求的場景

leonarding發表於2012-11-28
自己構想一個使用手工鎖定解決一種業務需求的場景,並給出SQL演示。

場景:手工鎖定一個表,例如 我們在做一個秘密交易的時候,談好的價格就不能變了,必須一手交錢一手交貨完成交易,為了保證價格安全,我們先把價格表鎖定,這期間不允許篡改,保證完成交易
> lock table t1 in share mode;                                    手工鎖定一個表,設定鎖的級別為4
Table(s) Locked.
> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;
       SID TYPE              ID1        ID2      LMODE    REQUEST      BLOCK
---------- ---------- ---------- ---------- ---------- ---------- ----------
       138 TM              73449          0          4          0          0             已經在T1表上加上了4號鎖,除了當前會話外阻塞其他會話進行修改
> insert into leo1.t1 values(5);                                   我們在會話leo2上插入一條記錄,此時hang住了不動了
> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;
       SID TYPE              ID1        ID2      LMODE    REQUEST      BLOCK
---------- ---------- ---------- ---------- ---------- ---------- ----------
       138 TM              73449          0          4          0          1     
       156 TM              73449          0          0          3          0
這就是由於我們加了4號鎖除了當前會話外阻塞156會話進行修改,156會話預設可以獲得一個3號鎖,由於3號和4號互斥不能共存,所以沒有獲得鎖,正在等待申請3號鎖
> commit;                                                                   鎖跟著事務的結束而釋放,commit   rollback都行
> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;     此時沒有鎖資訊了
no rows selected


2012.11.28
天津&winter
分享技術~成就夢想

Blog

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

相關文章