事务四大特征(ACID)
- 原子性(A):事务是最小单位,不可再分
- 一致性(C):事务要求所有的DML语句操作的时候,必须保证同时成功或者同时失败
- 隔离性(I):事务A和事务B之间具有隔离性
- 持久性(D):是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中)
开启事务
默认 autocommit=1 表示语句立即提交。如果要开启事务。需要先设置 autocommit=0
set @@autocommit = 0;select @@autocommit;
开启事务:start transaction 或 begin
提交事务:commit
回滚事务:rollback
嵌套事务|回滚控制
MySQL不支持嵌套事务,在开启新的事务前会默认提交了前一个事务。不过支持回滚点控制操作,类似实现了嵌套事务。
使用 savepoint 设置事务的保存点。
使用 rollback to savepoint 回滚到某个保存点。不回滚的事务点将会在最后一起提交。
begin;
insert into t(age) values(1);
savepoint t1; -- 定义保存点
insert into t(age) values(2);
savepoint t2; -- 定义保存点
insert into t(age) values(3);
savepoint t3;
insert into t(age) values(4);
rollback to savepoint t2; --指定了回滚的保存点
commit;
-- 数据库中值时1、2
当在一个事务中时再遇到 开启事务语句时(
begin`start transaction)就会隐式的执行一个commit操作; 所以在开启嵌套事务时应该使用savepoint` 语句来开启。而不是开启事务语句。
如果语句存在异常就会触发异常,异常会向上传导导致整个事务的回滚
drop table t;
create table t(a int, primary key(a));
begin;
insert into t(a) values(1);
SAVEPOINT s;
insert into t(a) values(2);
insert into t(a) values(2); -- 主键重复,异常触发,向上传递。整体事务回滚。表没有插入数据
ROLLBACK to SAVEPOINT s;
commit;
drop table t;
create table t(a int, primary key(a));
begin;
insert into t(a) values(1); -- 主事务异常,整体回滚。表没有插入数据
insert into t(a) values(1);
SAVEPOINT s;
insert into t(a) values(2);
ROLLBACK to SAVEPOINT s;
commit;
