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 总结
- 事务指需要保证原子性、隔离性、一致性和持久性的一个或多个数据库操作
- 事务的执行状态包括活动的、部分提交的、提交的、失败的、中止的。