一.建立表語句
delimiter $$
create
table
ifnot
exists spe_transaction_tab1 (
id int(11
)primary
keyauto_increment
notnull
,`name`
varchar(5
)null
, age int(3
)null
, created datetime(0
)null
)$$create
table
ifnot
exists spe_transaction_tab2 (
id int(11
)primary
keyauto_increment
notnull
,`name`
varchar(5
)null
, age int(3
)null
, created datetime(0
)null
)$$delimiter
;
二.建立儲存過程
2.1 無新增任務事務
delimiter $$
drop
procedure
ifexists
`proc_transaction_test`$$
create
procedure
`proc_transaction_test`()
begin
insert
into spe_transaction_tab1 (
`name`
,age,created)
values
('張三111111111111張三張三張三張三',12
,now()
);insert
into spe_transaction_tab2 (
`name`
,age,created)
values
('張三2',12
,now()
);end$$
delimiter
;
執行結果> 1406 - data too long for column 'name' at row 1
表中資料(都是空的)
mysql> select * from spe_transaction_tab1 ;
empty set (0.00 sec)
mysql> select * from spe_transaction_tab2 ;
empty set (0.00 sec)
2.2 無新增任務事務
delimiter $$
drop
procedure
ifexists
`proc_transaction_test`$$
create
procedure
`proc_transaction_test`()
begin
insert
into spe_transaction_tab2 (
`name`
,age,created)
values
('張三2',12
,now()
);insert
into spe_transaction_tab1 (
`name`
,age,created)
values
('張三111111111111張三張三張三張三',12
,now()
);end$$
delimiter
;
執行結果> 1406 - data too long for column 'name' at row 1
表中資料database changed
mysql> select * from spe_transaction_tab1 ;
empty set (0.00 sec)
mysql> select * from spe_transaction_tab2 ;
+----+---------+------+---------------------+
| id | name | age | created |
+----+---------+------+---------------------+
| 1 | 張三2 | 12 | 2020-06-24 15:23:57 |
+----+---------+------+---------------------+
說明了mysql 的整個儲存過程不是乙個原子操作 ! 我們需要為整個儲存過程新增事務
2.3 新增事務
delimiter $$
drop
procedure
ifexists
`proc_transaction_test`$$
create
procedure
`proc_transaction_test`()
begin
start
transaction
;##整個儲存過程指定為乙個事務
insert
into spe_transaction_tab2 (
`name`
,age,created)
values
('張三2',12
,now()
);insert
into spe_transaction_tab1 (
`name`
,age,created)
values
('張三111111111111張三張三張三張三',12
,now()
);commit
;end$$
delimiter
;
執行結果> 1406 - data too long for column 'name' at row 1
表中資料mysql> select * from spe_transaction_tab1 ;
empty set (0.00 sec)
mysql> select * from spe_transaction_tab2 ;
empty set (0.00 sec)
2.4 mysql的回滾事物的操作
在處理事務時,使用sqlexception捕獲sql錯誤,然後處理在mysql儲存過程中捕獲sql錯誤,最後判斷是回滾(rollback)還是提交(commit)。
delimiter $$
drop
procedure
ifexists
`proc_transaction_test`$$
create
procedure
`proc_transaction_test`()
begin
declare t_error integer
default0;
declare
continue
handler
for sqlexception set t_error=1;
start
transaction
;##整個儲存過程指定為乙個事務
insert
into spe_transaction_tab2 (
`name`
,age,created)
values
('張三2',12
,now()
);insert
into spe_transaction_tab1 (
`name`
,age,created)
values
('張三111111111111張三張三張三張三',12
,now()
);if t_error =
1then
rollback
;else
commit
;endif;
select t_error;
##返回標識位的結果集;
end$$
delimiter
;
執行結果mysql> call proc_transaction_test() ;
+---------+
| t_error |
+---------+
| 1 |
+---------+
1 row in set (0.01 sec)
表中資料mysql> select * from spe_transaction_tab1 ;
empty set (0.00 sec)
mysql> select * from spe_transaction_tab2 ;
empty set (0.00 sec)
mysql事務使用
預設mysql開啟了自動提交,在執行insert,update,delete語句時候每一條sql語句就是乙個事務。檢視自動提交 show global variables like autocommit 關閉自動提交 set global autocommit 0 開啟 set global aut...
batis plus事務使用
service實現類 service transactional propagation propagation.nested,isolation isolation.default,readonly false,rollbackfor restexception.class 加在類上面,下面方法預...
java事務使用
在web.xml中開啟對事物註解的解析 在方法上加上事務註解,propagation屬性在說明在 這裡,rollbackfor指定方法丟擲什麼異常後自動回滾。transactional propagation propagation.required,rollbackfor runtimeexcep...