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語句更複雜的功能,儲存在資料庫伺服器端,只需要編譯過一次之後再次使用都不需要再進行編譯。主要對儲存的過程進行控制。事務是一系列的資料更改操作組成的乙個整體。一旦事務中包含的某操作失敗或使用者中止,使用者可...