MySQL存儲過程 事務transaction

MySQL 中,單個 Store Procedure(SP) 不是原子操做,而 Oracle 則是原子的。以下的存儲過程,即便語句2 失敗,語句 1 仍然會被 commit 到數據庫中:java

 

[sql]  view plain  copy
 
  1. create table testproc(id int(4) primary key, name varchar(100));  
  2.    
  3. CREATE PROCEDURE test_proc_ins(  
  4. IN i_id INT,  
  5. IN i_name VARCHAR(100)  
  6. )  
  7. BEGIN  
  8.            INSERT INTO testproc VALUES (i_id, i_name);  -- 語句1  
  9.            INSERT INTO testproc VALUES (i_id, i_name);  -- 語句2(由於id爲PK,此語句將出錯)。  
  10. END;  


要使整個存儲過程成爲一個原子操做的辦法是:在存儲過程主體開始部分,指定開始一個事務。語句 2 失敗,語句 1 不會被 commit 到數據庫中,存儲過程將會在調用時拋出一個異常。mysql

 

 

[sql]  view plain  copy
 
  1. CREATE PROCEDURE test_proc_ins(  
  2. IN i_id INT,  
  3. IN i_name VARCHAR(100)  
  4. )  
  5. BEGIN  
  6. start transaction; --整個存儲過程指定爲一個事務  
  7.            INSERT INTO testproc VALUES (i_id, i_name);  
  8.            INSERT INTO testproc VALUES (i_id+1, i_name); -- 這裏把id+1,避免主鍵衝突  
  9. commit; -- 語句1。必須主動提交  
  10. END;  

 

[sql]  view plain  copy
 
  1. CREATE PROCEDURE test_proc_ins(  
  2. IN i_id INT,  
  3. IN i_name VARCHAR(100),  
  4. OUT o_ret INT)  
  5. BEGIN  
  6. start transaction;  
  7.            INSERT INTO testproc VALUES (i_id, i_name);  
  8.            INSERT INTO testproc VALUES (i_id+1,i_name);  
  9.            commit; -- 語句1,提交後,事務已結束  
  10.            set o_ret = 1;  
  11.            start transaction; -- 再啓一個事務  
  12.            INSERT INTO testproc VALUES (i_id+2,i_name); -- 語句2  
  13.            INSERT INTO testproc VALUES (i_id+2,i_name); -- 語句3  
  14.            set o_ret = 2;  
  15.            commit; -- 數據正常的狀況下,須要再次commit以結束事務  
  16. END;  



 

MySQL的回滾事物的操做sql

在處理事務時,使用SQLException捕獲SQL錯誤,而後處理; 按照這個推論,咱們必須在MySQL存儲過程當中捕獲SQL錯誤,最後判斷是回滾(ROLLBACK)仍是提交(COMMIT)。數據庫

 

[sql]  view plain  copy
 
  1. DROP PROCEDURE IF EXISTS  test_sp1   
  2. CREATE PROCEDURE test_sp1( )    
  3.     BEGIN    
  4.     DECLARE t_error INTEGER DEFAULT 0;    
  5.     DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;    
  6.     
  7.         START TRANSACTION;    
  8.             INSERT INTO test VALUES(NULL, 'test sql 001');       
  9.             INSERT INTO test VALUES('1', 'test sql 002');       
  10.     
  11.         IF t_error = 1 THEN    
  12.             ROLLBACK;    
  13.         ELSE    
  14.             COMMIT;    
  15.         END IF;    
  16.    select t_error;   //返回標識位的結果集;  
  17. END  


mysql事物處理實例oracle

MYSQL的事務處理主要有兩種方法
1.用begin,rollback,commit來實現
    begin開始一個事務
    rollback事務回滾
    commit 事務確認
2.直接用set來改變mysql的自動提交模式
    mysql默認是自動提交的,也就是你提交一個query,就直接執行!能夠經過
    set autocommit = 0 禁止自動提交
    set autocommit = 1 開啓自動提交
    來實現事務的處理。
但要注意當用set autocommit = 0 的時候,你之後全部的sql都將做爲事務處理,直到你用commit確認或 rollback結束,注意當你結束這個事務的同時也開啓了新的事務!按第一種方法只將當前的作爲一個事務!
MYSQL只有 INNODB和BDB類型的數據表才支持事務處理,其餘的類型是不支持的!spa

相關文章
相關標籤/搜索