Mysql 事务级别与差异
# 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 类型,从而避免幻读的问题。
# 相关文档
编辑 (opens new window)
上次更新: 2025/02/13, 18:17:08