<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Decode360's Blog

    業(yè)精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
      397 隨筆 :: 33 文章 :: 29 評(píng)論 :: 0 Trackbacks
    關(guān)于并發(fā)問題的測(cè)試
    ?
    ??? 在論壇上看到有人討論并發(fā)的這個(gè)問題,因?yàn)槠綍r(shí)主要是處理數(shù)據(jù)倉(cāng)庫(kù),所以對(duì)并發(fā)的問題一直沒有怎么注意,記錄一下:
    ?
    ?
    --第一段:
    create or replace procedure Delete_Pno(v_Pno varchar2) is
    ? v_state varchar2(20);
    begin
    ? begin
    ??? select state into v_state from P_Table where Pno = v_Pno;
    ? exception
    ??? when no_data_found then
    ????? dbms_output.put_line('Pno:' || v_Pno || 'not exists.');
    ????? return;
    ? end;
    ? if v_state = 'N' then
    ??? delete from P_Table where Pno = v_Pno;
    ??? dbms_output.put_line('Pno:' || v_Pno || 'delete success.');
    ? else
    ??? dbms_output.put_line('Pno:' || v_Pno || 'has been checked.');
    ? end if;
    commit;
    exception
    ? when others then
    ??? rollback;
    end;
    -- 如果在 select state into v_state 之后,如果發(fā)生了狀態(tài)變化,或者單證刪除,都會(huì)發(fā)生并發(fā)性錯(cuò)誤。
    --需要在select into 語(yǔ)句后面加上forupdate,這樣就可以鎖住該信息而防止其被修改或刪除。
    ?
    ?
    --第二段:
    create or replace procedure Delete_Pno(v_Pno varchar2) is
    ? v_state varchar2(20);
    begin
    ? delete from P_Table
    ?? where Pno = v_Pno
    ???? and state = 'N';
    ? if sql%rowcount > 0 then
    ??? dbms_output.put_line('Pno:' || v_Pno || 'delete success.');
    ? else
    ??? begin
    ????? select state into v_state from P_Table where Pno = v_Pno;
    ??? exception
    ????? when no_data_found then
    ??????? dbms_output.put_line('Pno:' || v_Pno || 'not exists.');
    ??????? return;
    ??? end;
    ??? dbms_output.put_line('Pno:' || v_Pno || 'has been checked.');
    ? end if;
    commit;
    exception
    ? when others then
    ??? rollback;
    end;
    --先刪除必然需要?jiǎng)h除的,然后再判斷是不存在還是無需刪除,這樣不會(huì)出現(xiàn)并發(fā)錯(cuò)誤。
    ?
    ?
    --第三段
    create or replace procedure Delete_Pno(v_Pno varchar2) is
    ? v_state varchar2(20);
    begin
    ? delete from P_Table where Pno = v_Pno returning state into v_state;
    ? if sql%rowcount > 0 then
    ??? if v_state = 'N' then
    ????? dbms_output.put_line('Pno:' || v_Pno || 'delete success.');
    ??? else
    ????? rollback;
    ????? dbms_output.put_line('Pno:' || v_Pno || 'has been checked.');
    ????? return;
    ??? end if;
    ? else
    ??? dbms_output.put_line('Pno:' || v_Pno || 'not exists.');
    ? end if;
    commit;
    exception
    ? when others then
    ??? rollback;
    end;
    --用returning返回狀態(tài),如果狀態(tài)是'N'則刪除,否則回滾,這樣也不會(huì)有并發(fā)的問題。
    ?
    ?
    ?
    ??? 要注意delete from P_Table where Pno = v_Pno returning state into v_state;語(yǔ)句屬于OUT BIND
    ??? 就好比是update ... set () = (select ...) 一樣,語(yǔ)句和自己的子句之間,是不會(huì)造成并發(fā)的不一致性的。
    ?
    ?
    posted on 2009-01-30 22:22 decode360 閱讀(143) 評(píng)論(0)  編輯  收藏 所屬分類: 06.PLSQL
    主站蜘蛛池模板: 成人免费a级毛片| 亚洲阿v天堂在线2017免费| 九月丁香婷婷亚洲综合色| 国产午夜亚洲精品国产成人小说| 免费在线视频一区| 亚洲av综合色区| 亚洲日韩AV一区二区三区四区| 亚洲精品无码你懂的| 性感美女视频在线观看免费精品 | 国产精品免费播放| 亚洲男同帅GAY片在线观看| 国产成人精品日本亚洲网址| 羞羞漫画在线成人漫画阅读免费| 中国人免费观看高清在线观看二区| 在线观看免费中文视频| 免费一级毛片在级播放| 日韩在线视频播放免费视频完整版 | 日韩一区二区在线免费观看| 亚洲AV天天做在线观看| 亚洲AV网一区二区三区| 久久国产精品免费看| 免费一级e一片在线播放| 九九免费久久这里有精品23| 成人黄18免费视频| 亚洲av网址在线观看| 国内精品乱码卡1卡2卡3免费| 国产AV无码专区亚洲AWWW | 四虎国产精品成人免费久久| 在线观看亚洲精品国产| 国产精品免费福利久久| 亚洲乱码在线卡一卡二卡新区 | 114一级毛片免费| 亚洲高清视频在线观看| 在线观看视频免费完整版| 久久亚洲AV成人出白浆无码国产 | 国产亚洲AV夜间福利香蕉149| 永久免费AV无码网站国产| 亚洲第一页日韩专区| 亚洲国产最大av| 亚洲熟伦熟女新五十路熟妇 | 亚洲AV永久无码精品网站在线观看|