SQL 标准定义了四种事务隔离级别,分别是:
- 读未提交(Read Uncommitted):允许事务读取另一个事务未提交的数据,可能会导致脏读现象。
- 读已提交(Read Committed):只允许事务读取另一个事务已提交的数据,避免了脏读现象,但仍然可能会出现不可重复读和幻读现象。
- 可重复读(Repeatable Read):在一个事务中多次读取同一数据行时,返回的结果是相同的,避免了脏读和不可重复读现象,但仍然可能会出现幻读现象。
- 串行化(Serializable):事务完全隔离,避免了所有并发异常现象。结果等价于串行(Serial),即事务是非交错执行。
事务隔离级别和事务并发异常的关系如下表:
| Isolation Level | Dirty Read | Nonrepeatable Read | Phantom Read | Serialization Anomaly |
|---|---|---|---|---|
| Read uncommitted | Allowed, but not in PG | Possible | Possible | Possible |
| Read committed | Not possible | Possible | Possible | Possible |
| Repeatable read | Not possible | Not possible | Allowed, but not in PG | Possible |
| Serializable | Not possible | Not possible | Not possible | Not possible |
PostgreSQL 并未完全实现其中的一些隔离级别1。SQL 标准只指定了哪些异常不能在某些隔离级别发生,在较低隔离级别下提供更高的保证是被允许的。