事务四大特征(ACID)

  • 原子性(A):事务是最小单位,不可再分
  • 一致性(C):事务要求所有的DML语句操作的时候,必须保证同时成功或者同时失败
  • 隔离性(I):事务A和事务B之间具有隔离性
  • 持久性(D):是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中)

开启事务

默认 autocommit=1 表示语句立即提交。如果要开启事务。需要先设置 autocommit=0

  1. set @@autocommit = 0;
  2. select @@autocommit;

开启事务:start transactionbegin
提交事务: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;