MySQL儲存過程 事務transaction

2022-05-05 09:12:09 字數 2896 閱讀 8401

mysql 中,單個 store procedure(sp) 不是原子操作,而 oracle 則是原子的。如下的儲存過程,即使語句2 失敗,語句 1 仍然會被 commit 到資料庫中:

[sql]view plain

copy

create table testproc(id int(4) primary key, name varchar(100));  

create procedure test_proc_ins(  

in i_id int,  

in i_name varchar(100)  

)  begin  

insert into testproc values (i_id, i_name);  -- 語句1  

insert into testproc values (i_id, i_name);  -- 語句2(因為id為pk,此語句將出錯)。  

end;  

要使整個儲存過程成為乙個原子操作的辦法是:在儲存過程主體開始部分,指定開始乙個事務。語句 2 失敗,語句 1 不會被 commit 到資料庫中,儲存過程將會在呼叫時丟擲乙個異常。

[sql]view plain

copy

create procedure test_proc_ins(  

in i_id int,  

in i_name varchar(100)  

)  begin  

start transaction; --整個儲存過程指定為乙個事務  

insert into testproc values (i_id, i_name);  

insert into testproc values (i_id+1, i_name); -- 這裡把id+1,避免主鍵衝突  

commit; -- 語句1。必須主動提交  

end;  

[sql]view plain

copy

create procedure test_proc_ins(  

in i_id int,  

in i_name varchar(100),  

out o_ret int)  

begin  

start transaction;  

insert into testproc values (i_id, i_name);  

insert into testproc values (i_id+1,i_name);  

commit; -- 語句1,提交後,事務已結束  

set o_ret = 1;  

start transaction; -- 再啟乙個事務  

insert into testproc values (i_id+2,i_name); -- 語句2  

insert into testproc values (i_id+2,i_name); -- 語句3  

set o_ret = 2;  

commit; -- 資料正常的情況下,需要再次commit以結束事務  

end;  

mysql的回滾事物的操作

在處理事務時,使用sqlexception捕獲sql錯誤,然後處理; 按照這個推論,我們必須在mysql儲存過程中捕獲sql錯誤,最後判斷是回滾(rollback)還是提交(commit)。

[sql]view plain

copy

drop procedure if exists  test_sp1   

create procedure test_sp1( )    

begin    

declare t_error integer default 0;    

declare continue handler for sqlexception set t_error=1;    

start transaction;    

insert into test values(null, 'test sql 001');       

insert into test values('1', 'test sql 002');       

if t_error = 1 then    

rollback;    

else    

commit;    

end if;    

select t_error;   //返回標識位的結果集;  

end  

mysql事物處理例項

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型別的資料表才支援事務處理,其他的型別是不支援的!

mysql 儲存過程與事務

最近在工作中要實現乙個功能,在乙個php檔案裡有乙個流水號的變數,每次執行這個php的檔案,這個流水號的變數都得不一樣,我就想到用mysql的自增來解決,我寫了乙個儲存過程,create procedure mqsearch in userid int,in type int,out lshs bi...

MySQL儲存過程事務回滾

sql過程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 delimiter createdefiner root localhost procedure test procedure begin declareerrnoint declarecontinueh...

mysql的儲存過程與事務入門

儲存過程是 通過一系列的sql語句,根據傳入的引數 也可以沒有 通過簡單的呼叫,完成比單個sql語句更複雜的功能,儲存在資料庫伺服器端,只需要編譯過一次之後再次使用都不需要再進行編譯。主要對儲存的過程進行控制。事務是一系列的資料更改操作組成的乙個整體。一旦事務中包含的某操作失敗或使用者中止,使用者可...