隨筆-13  評論-28  文章-63  trackbacks-0
          DML會產(chǎn)生行鎖,只有該行的鎖解開后才可繼續(xù)對改行進行其他的DML,若新的DML和舊的DML操作的行相同,且舊DML以把行改變,則新DML不起作用

          準備工作:
          SQL>create table lck (a number, b number);
          SQL>insert into lck values (1,1);
          SQL>insert into lck values (2,2);
          SQL>insert into lck values (3,3);
          SQL>insert into lck values (4,4);
          SQL>insert into lck values (5,5);
          SQL>insert into lck values (6,6);
          SQL>insert into lck values (7,7);
          SQL>commit;

          實驗過程:

          步 驟Session 14Session 10說明
          1SQL> select sid from v$session
          where audsid=
          userenv('SESSIONID');

          SID
          ----------
          14
          SQL> select sid from v$session
          where audsid=
          userenv('SESSIONID');

          SID
          ----------
          10
          獲得當前session的SID
          2SQL> insert into lck values (1000,1001);

          1 row created.
           未提交
          3SQL> select sid,type,id1,lmode,request from v$lock
          where sid in (10,14);

          SID TY ID1 LMODE REQUEST
          ---------- -- ---------- ---------- ----------
          14 TX 262153 6 0
          14 TM 4145 3 0
           因為Session14的DML未提交,因此在v$lock里產(chǎn)生2個鎖,一個為:transaction lock(TX),另一個為:DML/table lock(TM).LMODE=3代表:行排它.LMODE=6代表:對象排它
          4SQL> insert into lck values (1001,1000);

          1 row created.
           未提交
          5SQL> select sid,type,id1,lmode,request from v$lock
          where sid in (10,14);

          SID TY ID1 LMODE REQUEST
          ---------- -- ---------- ---------- ----------
          14 TX 262153 6 0
          14 TM 4145 3 0
          SQL> select * from lck;

          A B
          ---------- ----------
          1 2
          2 4
          3 6
          4 8
          5 3
          6 5
          7 7

          7 rows selected.
          v$lock中并不會因為對該表的再一次DML且未提交而新生成鎖
          6 SQL>update lck set a=2000,b=2001
          where a=1;

          1 row updated.
          未提交
          7SQL> select * from lck;

          A B
          ---------- ----------
          1 2
          2 4
          3 6
          4 8
          5 3
          6 5
          7 7
          1000 1001
          1001 1000

          9 rows selected.
          SQL> select sid,type,id1,lmode,request from v$lock
          where sid in (10,14);

          SID TY ID1 LMODE REQUEST
          ---------- -- ---------- ---------- ----------
          10 TX 327698 6 0
          10 TM 4145 3 0
          14 TX 262153 6 0
          14 TM 4145 3 0
          v$lock中對另外session10的DML產(chǎn)生了鎖
          8SQL>update lck set a=4000,b=2001
          where a=1;
           session10發(fā)出更新a=1行的SQL后,session14也發(fā)出更新a=1行的SQL,則后者的SQL懸在那里,無法結(jié)束
          9SQL> select event, seconds_in_wait, sid from v$session_wait where sid in (10,14);

          EVENT SECONDS_IN_WAIT SID
          ---------------------------------------------------------------- --------------- ----------
          enq: TX - row lock contention 1593 14
          SQL*Net message from client 2862 10
          v$session_wait中可以看到哪個session在等待,等待原因和已經(jīng)等待的時間
          100 rows updated.
           
          SQL>commit;

          Commit complete.
          只有在session10提交該DML后,session14才執(zhí)行完,但更新為0行
          11SQL> select * from lck;

          A B
          ---------- ----------
          1 2
          2 4
          3 6
          4 8
          5 3
          6 5
          7 7
          1000 1001
          1001 1000

          9 rows selected.
          SQL> select * from lck;

          A B
          ---------- ----------
          1 2
          2 4
          3 6
          4 8
          5 3
          6 5
          7 7
          1000 1001
          1001 1000

          9 rows selected.
           

          筆記來源: http://www.adp-gmbh.ch/ora/concepts/lock.html

          posted on 2006-08-24 13:14 七匹狼 閱讀(1865) 評論(2)  編輯  收藏 所屬分類: oracle

          評論:
          # re: oracle 10g 解鎖的相關(guān)操作 2006-08-27 22:31 | 冰川
          支持  回復(fù)  更多評論
            
          # re: oracle 10g 解鎖的相關(guān)操作 2009-01-19 09:39 | w
          受教咯```  回復(fù)  更多評論
            
          主站蜘蛛池模板: 涡阳县| 广德县| 木里| 荣昌县| 炎陵县| 诸暨市| 阿勒泰市| 天全县| 吉木萨尔县| 永寿县| 大冶市| 贵州省| 梅河口市| 彭州市| 华池县| 延津县| 长宁县| 资讯 | 贡山| 射洪县| 五寨县| 武川县| 泰州市| 宝丰县| 安溪县| 将乐县| 育儿| 大邑县| 莱阳市| 乌兰浩特市| 崇州市| 闵行区| 旬邑县| 靖江市| 麻栗坡县| 宁都县| 弥渡县| 通州区| 竹溪县| 海晏县| 岳西县|