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

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

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

    Decode360's Blog

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

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
      397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
    關于并發問題的測試
    ?
    ??? 在論壇上看到有人討論并發的這個問題,因為平時主要是處理數據倉庫,所以對并發的問題一直沒有怎么注意,記錄一下:
    ?
    ?
    --第一段:
    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 之后,如果發生了狀態變化,或者單證刪除,都會發生并發性錯誤。
    --需要在select into 語句后面加上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;
    --先刪除必然需要刪除的,然后再判斷是不存在還是無需刪除,這樣不會出現并發錯誤。
    ?
    ?
    --第三段
    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返回狀態,如果狀態是'N'則刪除,否則回滾,這樣也不會有并發的問題。
    ?
    ?
    ?
    ??? 要注意delete from P_Table where Pno = v_Pno returning state into v_state;語句屬于OUT BIND
    ??? 就好比是update ... set () = (select ...) 一樣,語句和自己的子句之間,是不會造成并發的不一致性的。
    ?
    ?
    posted on 2009-01-30 22:22 decode360 閱讀(139) 評論(0)  編輯  收藏 所屬分類: 06.PLSQL
    主站蜘蛛池模板: 亚洲国产精品自在自线观看| 亚洲视频网站在线观看| 亚洲第一成人在线| 1000部拍拍拍18勿入免费视频软件 | 亚洲一级毛片免费在线观看| 亚洲AV一宅男色影视| 国产在线一区二区综合免费视频| 亚洲日韩v无码中文字幕| 国产国产人免费人成成免视频 | 久久久久亚洲精品成人网小说| 国产免费无码AV片在线观看不卡| 亚洲国产另类久久久精品小说| 日本免费网址大全在线观看| 亚洲夂夂婷婷色拍WW47| 国产精品国产午夜免费福利看| 日本免费精品一区二区三区| 狠狠亚洲婷婷综合色香五月排名| 野花香高清视频在线观看免费| 99久久精品国产亚洲| 67194成是人免费无码| 国产精品观看在线亚洲人成网| 亚洲综合精品网站在线观看| 精品国产免费一区二区三区香蕉| 亚洲最大福利视频网站| 成年女人18级毛片毛片免费观看| 免费激情网站国产高清第一页| 久久久无码精品亚洲日韩蜜桃| 成人午夜免费福利视频| 国产成人精品日本亚洲语音 | 亚洲乱色伦图片区小说| 亚洲精品国产va在线观看蜜芽| 美女被cao网站免费看在线看| 亚洲H在线播放在线观看H| 免费欧洲毛片A级视频无风险| a成人毛片免费观看| 亚洲精品中文字幕无乱码麻豆| 亚洲av无码不卡私人影院| 香港a毛片免费观看| 亚洲JIZZJIZZ妇女| 久久精品亚洲日本佐佐木明希| 成人最新午夜免费视频|