加载中...
SQL 标准定义了四个事务隔离级别,从低到高分别是读未提交、读已提交、可重复读和串行化。不同级别在并发性能和数据一致性之间取不同权衡,解决了脏读、不可重复读、幻读等并发异常问题。

| SQL 标准定义 | SQL-92(ANSI/ISO) |
| MySQL 默认 | 可重复读(REPEATABLE READ) |
| PostgreSQL 默认 | 读已提交(READ COMMITTED) |
并发事务可能引发三种经典异常:脏读(读到另一个未提交事务的修改)、不可重复读(同一事务内两次读同一行结果不同,因为另一事务在中间修改并提交了)、幻读(同一事务内两次范围查询行数不同,因为另一事务在中间插入或删除了记录)。
四个隔离级别的防护力度逐级递增:读未提交三种异常都可能发生;读已提交防止脏读;可重复读防止脏读和不可重复读;串行化三种都防止,但本质上是让事务排队执行,并发性能极差。[1]
MySQL InnoDB 的默认隔离级别是可重复读,但它通过 MVCC + 间隙锁(Gap Lock)在很大程度上防止了幻读——这使得 MySQL 的可重复读实际上比 SQL 标准定义的更强,几乎接近串行化的一致性保证,同时保留了较好的并发性能。
PostgreSQL 的默认级别是读已提交,且对串行化级别的实现采用 SSI(Serializable Snapshot Isolation),能在不使用传统锁的情况下检测并回滚产生冲突的事务,相比悲观锁的串行化方案并发性更好,是学术界近年研究成果的工程实现。

| SQL 标准定义 | SQL-92(ANSI/ISO) |
| MySQL 默认 | 可重复读(REPEATABLE READ) |
| PostgreSQL 默认 | 读已提交(READ COMMITTED) |
登录 后参与讨论
暂无讨论,来发表第一条评论吧