事务隔离 影响并发事务如何相互看到变化。这是 ACID 特性的一个重要部分。ANSI SQL 中有四个基本隔离级别:
选择级别取决于应用程序的要求:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; -- 后续 SELECT 将看到“冻结”的值
“REPEATABLE READ 级别是否保证在任何数据库中保护幻读?”
不。在 PostgreSQL 和某些其他数据库中,REPEATABLE READ 级别只防止脏读和不可重复读,但不一定保护幻读。在 MySQL/InnoDB 中,REPEATABLE READ 本质上是 SERIALIZABLE,但在其他数据库中则不然。
-- 在一个事务中读取 SELECT * FROM orders WHERE amount > 100; -- 在另一个事务中插入新值 amount > 100 并提交 -- 如果隔离级别低于 SERIALIZABLE,第一个事务在重选时会看到“幻影”行
故事
一个金融服务仅将隔离级别设置为 READ COMMITTED 以提高性能 — 用户看到了已经被其他进程更改的金额,余额出现了不一致。
故事
在酒店预订系统中发生了同一房间的双重预订 — 事务没有隔离当前预订的加载,级别为 READ COMMITTED。
故事
从 MySQL 迁移到 PostgreSQL:开发人员习惯了 REPEATABLE READ 保护幻读,但迁移后出现了预料之外的“悬挂”订单,当在同一事务中进行重复查询时。