# 事务

# 1. 事务的概念

InnoDB 支持事务机制,而 MyISAM 不支持,这就是 InnoDB 更常见、更常用的原因。

『事务』(Transaction)是一系列(多条)相关 SQL 语句组成的最小的逻辑工作单元,即,不允许存在一部分执行成功,一部分执行不成功的情况。

最典型的例子是两个银行账户的转账,不允许存在一个账户上已经扣了钱,但另一个账户新增不成功的情况。

MySQL 使用 START TRANSACTION 来标识一个事务的开始。

# 2. 事务的提交和回滚

要永久性地记录事务中 SQL 语句的结果,需要执行 COMMIT 语句,从而提交事务。

要取消 SQL 语句的结果,需要执行 ROLLBACK 语句,从而回滚事务,将所有行重新设置为原始状态。

简而言之,COMMIT 就是确认你刚才所执行的 SQL 语句,而 ROLLBACK 就是撤销你刚才所执行的 SQL 语句。

START TRANSACTION;
INSERT INTO dept VALUES(50, 'SOFTEWARE', 'BEI JING');
COMMIT;
START TRANSACTION;
UPDATE dept SET loc='SHANG HI' WHERE deptno=40;
ROLLBACK;

需要注意的是:

  • 事务用来管理 INSERTUPDATEDELETE 语句。
  • 你不能回退 SELECT 语句(这样做也没有意义,因为 SELECT 语句未对数据库造成变化)。
  • CREATEDROP 操作即便是回退,也不会被撤销。

# 3. 事务的开始与结束

事务既有起点,也有终点。一个事务以 START TRANSACTION; 开始,以 COMMIT;ROLLBACK; 结束。

默认 MySQL 启用了自动提交机制,即 MySQL 会『帮』你在每一条单独的 SQL 语句前后加上 START TRANSACTION;COMMIT;

自动提交的优缺点十分分明,有点在于无需你人为说明事务的开始和结束,但你无法将两条(或多条)SQL语句放入同一个事务中

取消 MySQL 的的自动提交功能使用命令:SET autocommit = off; 或者是 SET autocommit = 0;

另外,如果在事务正在执行过程中(即事务还未提交),因为外界客观因素导致事务的结束(如断电、硬盘损坏等),事务会自动回滚。

# 4. 事务的 ACID 特性

数据库理论对事务采用了更严格的定义,说明事务有 4 个基本特性,称为 ACID 特性。

  • 原子性(Atomic):事务是原子的,事务中所包含的 SQL 语句都是一个不可分割的工作单元。
  • 一致性(Consist):事务必须确保数据库的数据库的状态保持一致,在事务开始时,数据库的状态时一致的;在事务结束时,数据库状态也必须是一致的。
  • 隔离性(Isolated):多个事务可以独立运行,而不会彼此影响。
  • 持久性(Durable):一旦事务被提交之后,数据库的变化就会被永久保存下来。