18.1 事务的起源
CREATE TABLE account (
id INT NOT NULL AUTO_INCREMENT COMMENT '自增id',
name VARCHAR(100) COMMENT '客户名称',
balance INT COMMENT '余额',
PRIMARY KEY (id)
) Engine=InnoDB CHARSET=utf8;
 
insert into account (name, balance) values ('狗哥', 11), ('猫爷', 2);
 
18.1.1 原子性(Atomicity)
不可分割,要么全做,要么全不做。
18.1.2 隔离性(Isolation)
访问相同数据的不同操作之前互相隔离,互不影响——线程安全
18.1.3 一致性(Consistency)
数据库世界是现实世界的一个映射,现实世界中存在的约束也要在数据库世界中体现。如果数据库中的数据全部符合现实世界中的约束,我们说这些数据就是一致的,或者说符合一致性的。
18.1.4 持久性(Durability)
当一个状态转换完成后,这个转换结果将永久保留。
18.2 事务的概念
保证原子性、隔离性、一致性和持久性的一个或多个数据库操作称为一个事务(transaction)。
| 事务状态 | 描述 | 
|---|---|
| 活动的(active) | 事务应对的数据库操作正在执行过程中 | 
| 部分提交的(partially committed) | 事务中的最后一个操作执行完成,但由于操作都在内存中执行,所造成的影响并没有刷新到磁盘时 | 
| 失败的(failed) | 事务处在活动的或部分提交的状态时,遇到了某些错误而无法继续执行,或人为停止当前事务的执行 | 
| 中止的(abort) | 失败后回滚完成 | 
| 提交的(committed) | 处在部分提交的状态的事务同步到磁盘上后 | 

18.3 MySQL中事务的语法
18.3.1 开启事务
BEGIN;
 
START TRANSACTION [option];
 
- READ WRITE:读写事务
 - WITH CONSISTENT SNAPSHOT:一致性读
 
18.3.2 提交事务
COMMIT;
 
18.3.3 手动中止事务
ROLLBACK;
 
18.3.4 支持事务的存储引擎
目前只有 InnoDB 和 NDB 。
18.3.5 自动提交
SHOW VARIABLES LIKE 'autocommit';
 

默认情况下,如果不显式开启事务,那么每一条语句都算是一个独立的事务。这种特性称为自动提交。
18.3.6 隐式提交
开启事务后,虽然没有手动提交,但因为输入了某些语句导致事务被偷偷提交。
- 定义或修改数据库对象的DDL
 - 隐式使用或修改 mysql 库中的表
 - 事务控制或关于锁定的语句
 - 加载数据的语句
 - 关于 MySQL 复制的一些语句
 - 其他一些语句
 
18.3.7 保存点
savepoint,在事务对应的数据库语句中打几个点,回滚时可以指定回滚到某个点。
18.4 总结
- 事务指需要保证原子性、隔离性、一致性和持久性的一个或多个数据库操作
 - 事务的执行状态包括活动的、部分提交的、提交的、失败的、中止的。
 



















