数据库事务隔离问题详解:脏读、不可重复读与幻读
一、事务隔离基础概念
1.1 事务的ACID特性
数据库事务具有四个核心特性(ACID):
- 原子性(Atomicity):事务是不可分割的工作单位
- 一致性(Consistency):事务执行前后数据库保持一致性状态
- 隔离性(Isolation):并发事务之间互不干扰
- 持久性(Durability):事务提交后结果永久保存
隔离性问题就是在多个事务并发执行时,由于隔离性保障不足导致的数据一致性问题。
1.2 事务隔离级别
SQL标准定义了四种隔离级别:
- READ UNCOMMITTED(读未提交)
- READ COMMITTED(读已提交)
- REPEATABLE READ(可重复读)
- SERIALIZABLE(可串行化)
二、脏读(Dirty Read)
2.1 定义
脏读是指一个事务读取了另一个未提交事务修改过的数据。
2.2 产生场景
- 事务A修改了某行数据但未提交
- 事务B读取了事务A修改后的数据
- 事务A最终回滚了修改
-- 事务A
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1; -- 未提交