1. 程式人生 > >MYSQL 巢狀事務(SAVEPOINT) 與Spring 事務傳播

MYSQL 巢狀事務(SAVEPOINT) 與Spring 事務傳播

摘要

savepoint 關鍵字可以實現巢狀事務。結合savepoint關鍵字,更方便理解spring的事務傳播。

事務巢狀

初始化表指令碼

drop table t;
create table t(a int, primary key(a));

開啟事務

mysql事務預設是自動提交的。通過下面的命令關閉事務自動提交。(mysql事務特性是基於同一個連結,不同的連結沒有事務關係,所以在測試的時候,保證是同一個視窗)

set @@autocommit = 0;
select @@autocommit;

區域性事務,外部事務都正常提交

-- 開啟事務
begin;

insert into t(a) values(1);

-- 
SAVEPOINT s;

insert into t(a) values(2);

RELEASE SAVEPOINT s;

commit;

查詢結果,1和2都插入成功了。

select * from t;

區域性事務回滾,外部事務提交


begin;

insert into t(a) values(1);

SAVEPOINT s;

insert into t(a) values(2);

ROLLBACK to  SAVEPOINT s;

commit;

這裡區域性事務回滾了,整體事務提交,查詢結果,只有1插入成功,2沒有插入,表示外部事務提交了,區域性事務回滾了。

select * from t;

區域性事務提交,外部事務回滾

begin;

insert into t(a) values(1);

SAVEPOINT s;

insert into t(a) values(2);

 RELEASE  SAVEPOINT s;

ROLLBACK;

全域性事務回滾,整個事務都回滾了,1和2都沒有插入成功

select * from t;

區域性事務回滾,外部事務回滾

這個很明顯,1和2都不能插入成功。

參考文件

mysql巢狀事務 事務之六:sp