保证数据库隔离性(Isolation),本质上是让并发事务之间互不干扰,避免出现脏读、不可重复读、幻读等问题。下面从概念 → 实现机制 → 实践建议三个层面说明。
事务并发时可能出现的问题:
| 问题 | 说明 |
|---|---|
| 脏读 | 读到其他事务未提交的数据 |
| 不可重复读 | 同一事务内多次读,结果不同(被改了) |
| 幻读 | 同一查询条件,两次查询结果行数不同(被增删) |
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| 读未提交(Read Uncommitted) | ❌ | ❌ | ❌ |
| 读已提交(Read Committed) | ✅ | ❌ | ❌ |
| 可重复读(Repeatable Read) | ✅ | ✅ | ❌* |
| 串行化(Serializable) | ✅ | ✅ | ✅ |
*MySQL InnoDB 在可重复读下通过 MVCC + 间隙锁避免了幻读
核心思想:
读不加锁,写不阻塞读
实现方式:
✅ 优点:
✅ 常见于:
MySQL 示例:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Spring 示例:
@Transactional(isolation = Isolation.REPEATABLE_READ)
❌ 错误:
✅ 正确:
长事务会:
问题:
解决方式:
SELECT ... FOR UPDATEUPDATE account
SET balance = balance - 100
WHERE id = 1 AND version = 2;
| 数据库 | 默认隔离级别 |
|---|---|
| MySQL InnoDB | 可重复读 |
| PostgreSQL | 读已提交 |
| Oracle | 读已提交 |
数据库通过锁 + MVCC + 事务日志保证隔离性;
开发者通过选对隔离级别、控制事务范围、避免长事务来“用好”隔离性。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。