• <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
            999久久久无码国产精品| 日韩人妻无码精品久久免费一| 狠狠色丁香久久婷婷综合蜜芽五月| 久久九九青青国产精品| 久久99精品国产| 国产亚洲欧美成人久久片| 精品久久久久久久久中文字幕| 久久人人爽人人爽人人片av高请 | 一本色道久久88综合日韩精品| 国产精品99久久久久久宅男 | 久久精品夜色噜噜亚洲A∨| 久久99精品国产麻豆婷婷| 青青久久精品国产免费看| 久久大香萑太香蕉av| 亚洲欧洲日产国码无码久久99| 久久久一本精品99久久精品88 | 国产成年无码久久久免费| 久久天天躁狠狠躁夜夜网站| 久久国产精品国产自线拍免费 | 亚洲国产小视频精品久久久三级| 色综合合久久天天给综看| 久久精品国产乱子伦| 国产一级做a爰片久久毛片| 色99久久久久高潮综合影院| 人妻丰满AV无码久久不卡| 青青国产成人久久91网| 一本久久a久久精品综合香蕉 | 激情综合色综合久久综合| 久久亚洲精品无码aⅴ大香| 久久不见久久见免费视频7| 麻豆久久| 青青国产成人久久91网| 久久精品国产亚洲AV久| 丁香五月综合久久激情| 亚洲精品国产美女久久久| 国产一区二区精品久久岳| 国产色综合久久无码有码| 久久久精品日本一区二区三区 | 精品无码人妻久久久久久| 久久天天躁狠狠躁夜夜96流白浆| 欧美成a人片免费看久久|