<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 :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
      302 隨筆 :: 26 文章 :: 82 評論 :: 0 Trackbacks
    ??? 在論壇上看到有人討論并發(fā)的這個問題,因為平時主要是處理數(shù)據倉庫,所以對并發(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)變化,或者單證刪除,都會發(fā)生并發(fā)性錯誤。
    --需要在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;
    --先刪除必然需要刪除的,然后再判斷是不存在還是無需刪除,這樣不會出現(xiàn)并發(fā)錯誤。
    ?
    ?
    --第三段
    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'則刪除,否則回滾,這樣也不會有并發(fā)的問題。
    ?
    ?
    ?
    ??? 要注意delete from P_Table where Pno = v_Pno returning state into v_state;語句屬于OUT BIND
    ??? 就好比是update ... set () = (select ...) 一樣,語句和自己的子句之間,是不會造成并發(fā)的不一致性的。
    ?




    -The End-

    posted on 2009-01-30 22:22 decode360-3 閱讀(163) 評論(0)  編輯  收藏 所屬分類: SQL Dev
    主站蜘蛛池模板: 亚洲国产婷婷综合在线精品| 国产免费小视频在线观看| 国产亚洲人成网站观看| 色吊丝性永久免费看码 | WWW国产成人免费观看视频| www亚洲精品少妇裸乳一区二区 | 亚洲va久久久久| 女人18毛片a级毛片免费| 国产亚洲欧美日韩亚洲中文色| 日韩在线看片免费人成视频播放| 亚洲精品亚洲人成在线| 国产精品免费一级在线观看| 未满十八私人高清免费影院| 亚洲欧洲日产国码一级毛片| 日韩精品无码免费专区午夜| 久久精品国产亚洲AV大全| 青娱乐免费在线视频| 亚洲爆乳无码专区www| 亚洲国产一成久久精品国产成人综合 | 亚洲福利电影一区二区?| 国产免费久久精品99re丫y| 亚洲欧洲无卡二区视頻| 国产一区二区三区在线免费观看| 一级看片免费视频| 亚洲色自偷自拍另类小说 | 大地资源免费更新在线播放| 爱爱帝国亚洲一区二区三区| 激情综合色五月丁香六月亚洲| 四虎影视成人永久免费观看视频 | 人成电影网在线观看免费| 亚洲av伊人久久综合密臀性色| 国产日本一线在线观看免费| 免费一区二区三区在线视频| 亚洲AV日韩精品久久久久久| 日韩成人免费视频播放| 最近免费字幕中文大全| 亚洲AV无码一区二区三区人| 亚洲精品色婷婷在线影院| 57pao国产成视频免费播放| 色婷婷亚洲一区二区三区| 亚洲Aⅴ无码专区在线观看q|