MySQL 事务主要用于处理操作量大,复杂度高的数据

说明

  • 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务
  • 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
  • 事务用来管理 INSERT、UPDATE、DELETE 语句

    特征

    原子性

    Atomicity:每个事务(Transaction)都看作最小逻辑操作,不可进行分割;执行错误,会被回滚(Rollback)到事务开始前

    一致性

    Consistency:在事务开始之前和事务结束以后,数据库的完整性没有被破坏

    隔离性

    Isolation:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
  • 读未提交(Read Uncommitted):允许脏读取,但不允许更新丢失;通过“排他写锁”实现
  • 读提交(Read Committed):不可重复读取,但不允许脏读取;通过“瞬间共享读锁”和“排他写锁”实现
  • 可重复读(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻读数据;通过“共享读锁”和“排他写锁”实现
  • 序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行

    持久性

    Durability:当事务执行完毕(事务提交),该操作将永久的改变了数据库中的数据

    语句

    1
    2
    3
    4
    5
    6
    BEGIN 或 START TRANSACTION 显式地开启一个事务;
    COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;
    ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
    SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;
    RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
    ROLLBACK TO identifier 把事务回滚到标记点;

    提交事务

    MySQL 默认自动提交事务,使用 SET AUTOCOMMIT 来改变 MySQL 的提交模式
    1
    2
    3
    4
    #关闭自动提交
    SET AUTOCOMMIT=0
    #开启自动提交
    SET AUTOCOMMIT=1
    如果语句使用 START TRANSACTION 开始的事务,只有使用 COMMIT、ROLLBACK 才能提交回滚

不用观这个设置,直接用 BEGIN、ROLLBACK、COMMIT 来实现事务即可

1
2
3
4
5
6
7
8
9
#开始一个事务
BEGIN;
#设置事务保存点
SAVEPOINT p1;
#事务回滚
ROLLBACK;
ROLLBACK TO p1;
#事务确认
COMMIT;

隔离级别

InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。

1
2
#设置事务的隔离级别
SET TRANSACTION level;