mysql實(shí)現(xiàn)事務(wù)的提交和回滾實(shí)例
mysql創(chuàng)建存儲(chǔ)過(guò)程的官方語(yǔ)法為:
START TRANSACTION | BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET AUTOCOMMIT = {0 | 1}
我這里要說(shuō)明的mysql事務(wù)處理多個(gè)SQL語(yǔ)句的回滾情況。比如說(shuō)在一個(gè)存儲(chǔ)過(guò)程中啟動(dòng)一個(gè)事務(wù),這個(gè)事務(wù)同時(shí)往三個(gè)表中插入數(shù)據(jù),每插完一張表需要判斷其是否操作成功,如果不成功則需要回滾,最后一張表判斷其插入成功之后commit。這里需要注意的是不能直接使用事務(wù)的collback,這樣是不能實(shí)現(xiàn)回滾的或者說(shuō)可能出現(xiàn)意外的錯(cuò)誤。
那么我們需要的是一個(gè)條件判斷,比如loop,因?yàn)镸ySql默認(rèn)是會(huì)自動(dòng)提交的,所以我們不用擔(dān)心rollback之后條件退出而沒(méi)有commit。
具體mysql語(yǔ)句如下:
begin
loop_lable: loop
start transaction;
insert into table1(f_user_id) values(user_id);
if row_count() < 1 then
set @ret = -1;
rollback;
leave loop_label;
end if;
insert into table2(f_user_id) values(user_id);
if row_count() < 1 then
set @ret = -1;
rollback;
leave loop_label;
end if;
insert into table3(f_user_id) values(user_id);
if row_count() < 1 then
set @ret = -1;
rollback;
leave loop_label;
else
set @ret = 0;
commit;
leave loop_label;
end if;
end loop;
select @ret;
end
相關(guān)文章
MySQL實(shí)戰(zhàn)記錄之如何快速定位慢SQL
這可能是困然很多人的一個(gè)問(wèn)題,MySQL通過(guò)慢查詢?nèi)罩径ㄎ荒切﹫?zhí)行效率較低的SQL語(yǔ)句,下面這篇文章主要給大家介紹了關(guān)于MySQL實(shí)戰(zhàn)記錄之如何快速定位慢SQL的相關(guān)資料,需要的朋友可以參考下2022-03-03
mysql數(shù)據(jù)庫(kù)重命名語(yǔ)句分享
這篇文章主要介紹了mysql數(shù)據(jù)庫(kù)重命名語(yǔ)句救命示例,語(yǔ)句中的數(shù)據(jù)庫(kù)表前綴換成自己的就可以了,大家參考使用吧2014-01-01
淺談Mysql大數(shù)據(jù)分頁(yè)查詢解決方案
本文主要介紹了淺談Mysql大數(shù)據(jù)分頁(yè)查詢解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Mysql中強(qiáng)大的group?by語(yǔ)句解析
這篇文章主要介紹了Mysql中強(qiáng)大的group?by語(yǔ)句解析,GROUP?BY?語(yǔ)句根據(jù)一個(gè)或多個(gè)列對(duì)結(jié)果集進(jìn)行分組。在分組的列上我們可以使用?COUNT,?SUM,?AVG,等函數(shù),需要的朋友可以參考下2023-07-07
Mysql主從同步Last_IO_Errno:1236錯(cuò)誤解決方法
最近遇到Mysql主從同步的Last_IO_Errno:1236錯(cuò)誤問(wèn)題,然后在網(wǎng)上查找相關(guān)解決方案,這里分享給大家,供參考。2017-10-10

