事务的隔离级别:Read Uncommitted、Read Committed、Repeatable Read、Serializable

为什么需要隔离级别? 并发事务可能产生三大问题: 脏读(Dirty Read):读到未提交的数据 不可重复读(Non-Repeatable Read):同一查询两次结果不同 幻读(Phantom Read):范围查询两次结果不同 隔离级别就是用来控制在多大程度上解决这些问题。 四种隔离级别 级别对比表 隔离级别 脏读 不可重复读 幻读 性能 应用场景 READ UNCOMMITTED(读未提交) ❌ 会 ❌ 会 ❌ 会 ⭐⭐⭐⭐ 几乎不用 READ COMMITTED(读已提交) ✅ 避免 ❌ 会 ❌ 会 ⭐⭐⭐ Oracle/PostgreSQL默认 REPEATABLE READ(可重复读) ✅ 避免 ✅ 避免 ⚠️ 部分避免 ⭐⭐ MySQL默认(推荐) SERIALIZABLE(串行化) ✅ 避免 ✅ 避免 ✅ 避免 ⭐ 严格一致性要求 1. READ UNCOMMITTED(读未提交) 特点:事务可以读取其他事务未提交的数据(脏读)。 演示:脏读问题 -- 设置隔离级别 SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -- 事务A START TRANSACTION; SELECT balance FROM account WHERE user_id = 'A'; -- 读到1000 -- 事务B(并发执行) START TRANSACTION; UPDATE account SET balance = 500 WHERE user_id = 'A'; -- 未提交 -- 此时事务A再次查询 -- 事务A SELECT balance FROM account WHERE user_id = 'A'; -- 读到500(脏读!) COMMIT; -- 事务B ROLLBACK; -- 回滚,余额恢复到1000 问题:事务A读到了事务B未提交的数据(500),但事务B最终回滚了,导致数据不一致。 ...

2025-01-14 · maneng

如约数科科技工作室

浙ICP备2025203501号

👀 本站总访问量 ...| 👤 访客数 ...| 📅 今日访问 ...