• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            網絡服務器軟件開發/中間件開發,關注ACE/ICE/boost

            C++博客 首頁 新隨筆 聯系 聚合 管理
              152 Posts :: 3 Stories :: 172 Comments :: 0 Trackbacks

                   1.創建表測試表tb_test,如下:
            --------------------------------------------------------------------
              CREATE TABLE `tb_test` (
              `id` int(32) NOT NULL COMMENT 'k',
              `name` varchar(32) NOT NULL DEFAULT '',
              PRIMARY KEY (`id`)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
            --------------------------------------------------------------------
            其中id為主鍵,不能重復
                  2.創建存儲過程sp_test,如下:
            -------------------------------------------------------------------
            begin

              start transaction;
             insert into tb_test(id,name)  values (10000,'admin1');
             insert into tb_test(id,name)  values (10000,'admin2');

             commit;

            end

            ---------------------------------------------------------------------
                  3.現象:執行sp_test,由于id是唯一鍵,不能重復,所以sp_test中執行第二條insert語句時,會出現錯誤,后面的commit語句不會執行,也就不會提交,再次執行sp_test,報同樣的錯誤,但觀察數據表,admin1卻已經被寫到表里了
                  4.解釋:由于事務是針對當前連接的,第一次執行sp_test時,start transaction;開始了一個新的事物,第一個insert正確執行,第二個insert報錯,存儲過程返回,commit沒有執行;第二次執行sp_test,start transaction暗含了結束該連接的上一個事務的語義,由于第一次執行時admin1被正確寫入,此時提交,admin1就被真正的寫到表里了。
                  5.方案:第一種方案,把事物的開始,提交,回滾封裝到程序里面,只在存儲過程里面做具體的插入,更新操作,如果存儲過程成功就提交,如果失敗就回滾;第二種方案,在存儲過程里面捕獲異常,如果出現異常就回滾,否則就提交,具體代碼為:

            ---------------------------------------------------------------------
            begin
            DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
            begin
            rollback;
            select -1;
            end;

              start transaction;
             insert into tb_test(id,name)  values (10000,'admin1');
             insert into tb_test(id,name)  values (10000,'admin2');

             commit;

              select 0;
            end

            ---------------------------------------------------------------------

            這種方式,程序里面不會捕捉到任何異常,因為在存儲過程里處理了,如果存儲過程返回0表示成功,返回-1表示失敗,如有必要也可以返回自增id
            posted on 2010-09-16 15:57 true 閱讀(1686) 評論(0)  編輯 收藏 引用 所屬分類: mysql
            久久国产精品一区| 久久99中文字幕久久| 久久国产香蕉视频| 久久精品国产秦先生| 国产精品女同久久久久电影院| 2021最新久久久视精品爱| 久久亚洲精品无码观看不卡| 国产成人无码精品久久久久免费| 91精品国产综合久久四虎久久无码一级 | 久久久久精品国产亚洲AV无码| 欧美激情精品久久久久久久| 久久精品成人一区二区三区| 人妻丰满?V无码久久不卡| 伊人精品久久久久7777| 2020国产成人久久精品| 麻豆一区二区99久久久久| 久久精品亚洲日本波多野结衣| 国产成人久久AV免费| 2020最新久久久视精品爱| 久久久国产精华液| 97精品伊人久久久大香线蕉| 精品久久久久久成人AV| 99久久精品免费观看国产| 亚洲精品国精品久久99热| 综合网日日天干夜夜久久| 久久精品国产91久久综合麻豆自制| 久久免费视频网站| 色狠狠久久综合网| 国产精品美女久久久久| 久久天天躁狠狠躁夜夜2020 | 久久久久人妻一区精品| 久久久久久免费视频| 情人伊人久久综合亚洲| 7777精品伊人久久久大香线蕉| 久久777国产线看观看精品| 中文字幕无码久久人妻| 久久99精品国产| 97精品伊人久久久大香线蕉| 精品国产婷婷久久久| 久久久久人妻精品一区| 性高湖久久久久久久久AAAAA|