Mysql 事务级别与差异
目录(12)
Mysql 事务级别与特性
本文内容基于 Mysql 5.7 文档,不保证时效性…
| 隔离级别 | 能防止脏读 | 能防止不可重复读 | 能防止幻读 | 适用场景 |
|---|---|---|---|---|
| READ UNCOMMITTED | ❌ | ❌ | ❌ | 允许高并发,但数据不可靠(几乎不用) |
| READ COMMITTED | ✅ | ❌ | ❌ | 适用于大多数业务 |
| REPEATABLE READ | ✅ | ✅ | ❌ | InnoDB 默认,适合中等并发 |
| SERIALIZABLE | ✅ | ✅ | ✅ | 严格数据一致性,但性能差 |
ACID 模型
ACID 模型是一组数据库原则,它旨在保障事务的可靠性。
其中:
- Atomicity(原子性),确保事务为原子操作,即要求事务要么全部执行成功,要么完全回滚。
- Consistency(一致性),确保事务执行成功、失败,或执行中,不存在数据新旧值参半的情况。
- Isolation(隔离性),确保事务之间互不干扰或查看到彼此未提交的数据。
- Durability(持久性),确保事务执行成功后数据持久化到磁盘,不会受服务崩溃等情况影响。
脏读、幻读、不可重复读
脏读
脏读是指在事务中会读取到其它事务未提交的数据。且当其它事务回滚以后,该数据就变成了脏数据,因此会导致,当前事务基于脏数据进行后续操作,从而使得整个数据不可信。
幻读
幻读是指在事务中一个查询语句运行多次,多次的返回的结果集不同(数量多/少了),通常是由 INSERT 引起的。
不可重复读
不可重复读是在事务中前后两次查询的同一行数据内容不同,通常是由 UPDATE、DELETE 操作引起的。
隔离级别
REPEATABLE READ
可重复读级别,InnoDB 的默认级别。其确保在事务中,多次使用非 Lock SELECT 语句查询时,返回结果一致。
当前隔离级别下,一般不会出现幻读的情况,但使用 Lock SELECT 情况下,可能出现前后数据不一致的情况。
READ COMMITTED
读已提交级别,实现在当前事务中,读取其它已经提交的事务。因此会产生幻读、不可重复读的问题。
READ UNCOMMITTED
读未提交级别,在事务中可以读到其它事务未提交的数据,因此会产生脏读、不可重复读、幻读的问题。
SERIALIZABLE
序列化级别,该级别基于 RR, 隐式的将 SELECT 语句转为 Lock 类型,从而避免幻读的问题。