SQL 标准定义了四种事务隔离级别,分别是:

  • 读未提交(Read Uncommitted):允许事务读取另一个事务未提交的数据,可能会导致脏读现象。
  • 读已提交(Read Committed):只允许事务读取另一个事务已提交的数据,避免了脏读现象,但仍然可能会出现不可重复读和幻读现象。
  • 可重复读(Repeatable Read):在一个事务中多次读取同一数据行时,返回的结果是相同的,避免了脏读和不可重复读现象,但仍然可能会出现幻读现象。
  • 串行化(Serializable):事务完全隔离,避免了所有并发异常现象。结果等价于串行(Serial),即事务是非交错执行。

事务隔离级别和事务并发异常的关系如下表:

Isolation LevelDirty ReadNonrepeatable ReadPhantom ReadSerialization Anomaly
Read uncommittedAllowed, but not in PGPossiblePossiblePossible
Read committedNot possiblePossiblePossiblePossible
Repeatable readNot possibleNot possibleAllowed, but not in PGPossible
SerializableNot possibleNot possibleNot possibleNot possible

PostgreSQL 并未完全实现其中的一些隔离级别1。SQL 标准只指定了哪些异常不能在某些隔离级别发生,在较低隔离级别下提供更高的保证是被允许的。

Footnotes

  1. https://www.postgresql.org/docs/17/transaction-iso.html