Mysql 儲存過程的事務使用

2021-10-07 11:39:23 字數 4637 閱讀 9319

一.建立表語句

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...