事务
大约 2 分钟
事务
什么是事务?
事务通常由一个或者一组 SQL
操作组成, 满足 ACID 原则.
什么是 ACID?
ACID 原则是关系型数据库必须遵守的原则.
ACID 包括:
- Atomicity: 原子性
事务中的操作视作一个整体, 要么全部执行, 要么全部不执行. - Consistency: 一致性
数据库中的数据只能从一个一致性状态, 转换到另一个一致性状态. 即: 事务中的数据要么都成功更改, 要么都不被更改. - Isolation: 隔离性
事务之间是独立的, 互不影响. 一个未完成事务不会影响另一个未完成事务. - Durability: 持久性
事务一旦被提交, 数据更改就会被持久化保存.
事务的开启与关闭
- 使用
start transaction
,begin
,begin work
来开始事务. - 使用
commit
来提交一个事务. - 使用
rollback
来回滚一个事务.
事务回滚点
- 使用
savepoint point_name
来定义回滚点. - 使用
rollback to point_name
来回滚事务到回滚点.
事务隔离级别
读未提交--脏读问题
读已提交--不可重复读问题
可重复读(MySQL 默认)--幻读问题
串行化
脏读: 读取到事务未提交的数据.
不可重复读: 读取到其他事务新提交的数据.
幻读: 另一个事务在一个事务要处理的数据范围内新增了数据, 并且先于第一个事务提交.
读未提交
基于写互斥锁实现. 多个事务对同一个数据进行写操作时, 需要先获取互斥锁; 但是读操作不受影响.
读已提交
同样使用写互斥锁. 但是对读操作加入了MVCC多版本并发控制处理, 在每次进行读操作时, 都会创建一个 ReadView
, 包含最近一次事务提交的数据版本.
可重复读
同样使用写互斥锁 + MVCC, 但是在一次事务中, 只会在第一次读数据时创建 ReadView
, 因此之后所有读操作读到的数据都是一致的.
串行化
使用表锁, 让所有事务排队, 同一时间只能由一个事务在进行操作.