事务隔离级别是数据库并发控制的重要机制。
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;
根据业务需求选择:
理解隔离级别,合理配置并发策略。