隨筆 - 79  文章 - 11  trackbacks - 0
          <2009年5月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          不再墮落。
          Oracle documents: 
          http://tahiti.oracle.com/

          常用鏈接

          留言簿

          隨筆分類(66)

          隨筆檔案(79)

          相冊

          收藏夾(11)

          搜索

          •  

          積分與排名

          • 積分 - 53713
          • 排名 - 949

          最新隨筆

          最新評論

          閱讀排行榜

          insert阻塞不常見,對于帶主鍵的表,如果表上有唯一約束,有兩個(gè)會(huì)話試圖插入相同主鍵值的一條記錄,則其中一個(gè)會(huì)話會(huì)發(fā)生阻塞,直到另一個(gè)會(huì)話提交或回滾。
          mld@ORCL> create table demo ( x int primary key );

          表已創(chuàng)建。

          mld
          @ORCL> insert into demo values ( 1 );

          已創(chuàng)建 
          1 行。

          ----- session2
          mld
          @ORCL> insert into demo values ( 1 );

          --waiting。。。。。。。。

          解決:
              a,使主鍵保證唯一,可采用UUID,SEQUENCE等方式;
              b,使用DBMS_LOCK.REQUEST根據(jù)主鍵ID的hash值分配一個(gè)排它鎖,一次只有一個(gè)會(huì)話能請求成功,見代碼:
            
          mld@ORCL> conn sys/mld as sysdba
          已連接。
          sys
          @ORCL> grant execute on dbms_lock to mld;

          授權(quán)成功。
          mld
          @ORCL> create or replace trigger demo_bifer
            
          2  before insert on demo
            
          3  for each row
            
          4  declare
            
          5      l_lock_id   number;
            
          6      resource_busy   exception;
            
          7      pragma exception_init( resource_busy, -54 );
            
          8  begin
            
          9      l_lock_id :=
           
          10         dbms_utility.get_hash_value( to_char( :new.x ), 01024 );
           
          11      if ( dbms_lock.request
           
          12               (  id                => l_lock_id,
           
          13                  lockmode          => dbms_lock.x_mode,
           
          14                  timeout           => 0,
           
          15                  release_on_commit => TRUE ) <> 0 )
           
          16      then
           
          17          raise resource_busy;
           
          18      end if;
           
          19  end;
           
          20  /

          觸發(fā)器已創(chuàng)建

          mld
          @ORCL> show error;
          沒有錯(cuò)誤。
          mld
          @ORCL> insert into demo values ( 1 );

          已創(chuàng)建 
          1 行。

          --session 
          2
          mld
          @ORCL> insert into demo values ( 1 );
          insert into demo values ( 1 )
          *
          第 
          1 行出現(xiàn)錯(cuò)誤:
          ORA
          -00054: 資源正忙, 但指定以 NOWAIT 方式獲取資源
          ORA
          -06512: 在 "MLD.DEMO_BIFER", line 14
          ORA
          -04088: 觸發(fā)器 'MLD.DEMO_BIFER' 執(zhí)行過程中出錯(cuò)


          mld
          @ORCL>

          posted on 2009-05-06 22:45 donnie 閱讀(618) 評論(0)  編輯  收藏 所屬分類: database
          主站蜘蛛池模板: 南涧| 丹寨县| 五台县| 宜州市| 巴马| 丹江口市| 玛多县| 安泽县| 枣庄市| 岗巴县| 巴马| 景谷| 剑川县| 普定县| 碌曲县| 侯马市| 聂拉木县| 百色市| 芒康县| 湘西| 阳江市| 大港区| 理塘县| 桃源县| 镇赉县| 喀喇| 华坪县| 三明市| 桑日县| 即墨市| 平利县| 南宫市| 新安县| 阜新| 汉沽区| 灌南县| 获嘉县| 留坝县| 观塘区| 依兰县| 昌图县|