8.1 事务简介
事务的定义
需要保证原子性、隔离性、一致性和持久性的一个或多个数据库操作称为事务。
为什么要有事务?
现实世界的业务场景需要映射到数据库世界,而现实世界中的一次状态转换需要满足下面几种特性:
事务的四大特性
原子性:事务作为一个整体被执行,其中的操作要么都做,要么都不做。
一致性:事务执行前后,数据库处于合法的状态。
隔离性:多个事务并发执行时,事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能相互干扰。
持久性:事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
原子性(Atomicity)
拿转账作例子:
转账只有两种状态:要么转了,要么没转。这种规则叫做原子性。
隔离性(Isolation)
现实世界中,两种状态转换应该是互不影响的。让一些操作执行完了,再让另一些操作执行。
一致性(Consistency)
数据库中的数据符合所有现实世界的约束,比如红绿灯只有三种颜色,房价不能为负的。比如建立主键,唯一索引,外键等。
持久性(Durability)
一个状态转换完成后,这个转换的结果将永久保存。

可以看到,事务处于“提交的”或者“中止的”时候,事务结束。“中止的”代表数据库数据没有变化,“提交的”说明数据库变动刷新到磁盘了。
MySQL 怎么保证原子性?
undo Log
什么是脏读?
读到了另一个事务未提交的数据。
什么是不可重复读?
事务 B 读取了两次数据,读其中一次的过程中事务 A 改了数据,导致事务 B 读的两次数据不一样。
什么是幻读?
事务 B 前后两次读同一个范围的数据,事务 B 两次读取的过程中,事务 A 新增了数据,导致事务 B 后一次读取到了前一次查询没有读到的行。
四种隔离级别
- 读未提交
- 读提交
- 可重复读
- 串行化