程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql存儲過程中的事務管理示例及說明

mysql存儲過程中的事務管理示例及說明

編輯:MySQL綜合教程

mysql存儲過程中的事務管理示例及說明   今天研究了下在mysql的存儲過程中使用事務的東西,現在寫了一個小示例,在此記錄一下,便於以後借鑒:    www.2cto.com   Sql代碼   delimiter $$   use test$$   create procedure t_insert_table()   begin       /** 標記是否出錯 */       declare t_error int default 0;       /** 如果出現sql異常,則將t_error設置為1後繼續執行後面的操作 */       declare continue handler for sqlexception set t_error=1; -- 出錯處理       /** 顯式的開啟事務,它開啟後,事務會暫時停止自動提交*/       -- start transaction;       /** 關閉事務的自動提交 */       set autocommit = 0;       insert into t_bom_test(parent_id,child_id) values('D','abc');       insert into t_trigger_test(name,age) values('zhangsan',null);       /** 標記被改變,表示事務應該回滾 */       if t_error=1 then           rollback; -- 事務回滾       else           commit; -- 事務提交       end if;       -- rollback;       -- commit;   end$$   delimiter ;    寫完這個後,又發現書本上有很多地方都是直接在開始set autocommit = 0;在最後commit或rollback就完成了,我自己試驗了一下,結果出現如下問題: 1)當直接在開始set autocommit = 0;在最後commit或rollback後會出現一下錯誤: Error Code: 1048. Column 'age' cannot be null ,然後查看了一下數據庫表,發現第一條insert語句執行成功並成功commit了,而第二條則沒有; 2)當 Sql代碼   /** 標記是否出錯 */       declare t_error int default 0;       /** 如果出現sql異常,則將t_error設置為1後繼續執行後面的操作 */       declare continue handler for sqlexception set t_error=1; -- 出錯處理     這兩句代碼存在,而結束時不做if-else判斷,直接執行rollback語句時,發現即使兩條insert語句都執行成功了,但到最後仍然會被回滾掉;當直接執行commit語句時,發現如果第一條insert語句執行成功,第二條insert語句執行失敗時,查看數據庫表,會發現事務沒有回滾。   以上兩點是我的一點發現和疑惑,希望在此記錄一下,引以為鑒,當然,如果有朋友幫我解決了這個迷惑,我會萬分感激的。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved