giftiaのblog

acid 脏读、幻读、不可重复读 事务隔离级别

· 更新于 · giftia

ACID

  • 原子性(Atomicity):事务不可分割,操作要么全部成功,要么全部失败
  • 一致性(Consistency):事务前后数据库保持一致状态
  • 隔离性(Isolation):并发事务互不干扰
  • 持久性(Durability):事务提交后数据永久保存

脏读(假数据)

一个事务读取到了其他事务未提交的数据。

不可重复读(变数据)

同一事务中多次读取同一数据,前后读取的结果不同。(事务2执行update 数据变化)

幻读(新数据)

同一事务中多次查询同一范围的数据,前后查询结果数量不同。(事务2执行insert/delete 数据量变化)

事务隔离级别

隔离级别脏读不可重复读幻读
READ UNCOMMITTED
READ COMMITTED×
REPEATABLE READ(MySQL 默认)××√(InnoDB 可避免)
SERIALIZABLE×××

InnoDB 在 RR 级别下可以避免幻读,但快照读与当前读混用时仍可能出现幻读。

-- 查看隔离级别(MySQL 8.0+)
SELECT @@transaction_isolation;

-- 设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ-COMMITTED;