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

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

          常用鏈接

          留言簿

          隨筆分類(66)

          隨筆檔案(79)

          相冊

          收藏夾(11)

          搜索

          •  

          積分與排名

          • 積分 - 53708
          • 排名 - 948

          最新隨筆

          最新評論

          閱讀排行榜

          insert阻塞不常見,對于帶主鍵的表,如果表上有唯一約束,有兩個會話試圖插入相同主鍵值的一條記錄,則其中一個會話會發(fā)生阻塞,直到另一個會話提交或回滾。
          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值分配一個排它鎖,一次只有一個會話能請求成功,見代碼:
            
          mld@ORCL> conn sys/mld as sysdba
          已連接。
          sys
          @ORCL> grant execute on dbms_lock to mld;

          授權成功。
          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;
          沒有錯誤。
          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)錯誤:
          ORA
          -00054: 資源正忙, 但指定以 NOWAIT 方式獲取資源
          ORA
          -06512: 在 "MLD.DEMO_BIFER", line 14
          ORA
          -04088: 觸發(fā)器 'MLD.DEMO_BIFER' 執(zhí)行過程中出錯


          mld
          @ORCL>

          posted on 2009-05-06 22:45 donnie 閱讀(618) 評論(0)  編輯  收藏 所屬分類: database
          主站蜘蛛池模板: 拜泉县| 哈巴河县| 余江县| 无为县| 平舆县| 深州市| 孙吴县| 铜梁县| 泰安市| 德格县| 滦平县| 濮阳市| 广河县| 盐城市| 福鼎市| 凤台县| 黄平县| 烟台市| 太和县| 白城市| 长岭县| 昌宁县| 南江县| 蕲春县| 方山县| 射洪县| 固始县| 龙井市| 尚志市| 新津县| 方山县| 南宁市| 香河县| 当阳市| 桑日县| 健康| 博爱县| 珠海市| 安泽县| 南京市| 利川市|