数据库事务隔离级别 事务隔离级别是数据库并发控制的重要机制。 四种隔离级别 读未提交 特点: 可以读取未提交的数据 可能出现脏读 性能最好 读已提交 特点: 只能读取已提交的数据 避免脏读 可能出现不可重复读 可重复读 特点: 同一事务中读取结果一致 避免不可重复读 可能出现幻读 MySQL默认级别。 串行化 特点: 完全串行执行 避免所有并发问题 性能最差 并发问题 脏读 读取未提交的数据: 不可重复读 同一事务中多次读取结果不同: 幻读 查询结果集变化: MVCC机制 MySQL通过MVCC实现快照读: Read View 记录事务开始时的活跃事务列表。
事务隔离级别是数据库并发控制的重要机制。
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
特点:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
特点:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
特点:
MySQL默认级别。
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
特点:
读取未提交的数据:
事务A:UPDATE account SET balance = 100 事务B:SELECT balance(读到100) 事务A:ROLLBACK 结果:事务B读到不存在的数据
同一事务中多次读取结果不同:
事务A:SELECT balance(读到100) 事务B:UPDATE account SET balance = 200; COMMIT 事务A:SELECT balance(读到200)
查询结果集变化:
事务A:SELECT * FROM users WHERE age > 18(10条) 事务B:INSERT INTO users VALUES (...); COMMIT 事务A:SELECT * FROM users WHERE age > 18(11条)
MySQL通过MVCC实现快照读:
记录事务开始时的活跃事务列表。
记录行的多个版本:
row: [版本1] -> [版本2] -> [版本3]
-- 快照读:读取事务开始时的版本 SELECT * FROM users; -- 当前读:读取最新版本 SELECT * FROM users FOR UPDATE;
SELECT * FROM users LOCK IN SHARE MODE;
SELECT * FROM users FOR UPDATE;
防止幻读:
-- 锁定范围 SELECT * FROM users WHERE id BETWEEN 10 AND 20 FOR UPDATE;
根据业务需求选择:
理解隔离级别,合理配置并发策略。