Last updated
Last updated
ANSI SQL标准通过现象(Phenomena)定义(除此之外还可以通过锁、数据流图定义),下面首先使用形式化语言来定义以下几种现象:
脏写 P0 – (Dirty Write)
脏读 P1 – Dirty Read
不可重复读 P2 – Fuzzy or Non-Repeatable Read
幻读P3 – Phantom
ANSI SQL标准通过禁止上述现象的形式定义了四个隔离级别,分别是读未提交、读已提交、可重复读和可串行化:
读未提交:禁止脏写
读已提交:禁止脏读和脏写
可重复读:除幻读外,禁止其他现象
可串行化:禁止所有并发现象,效果如同事务以串行的方式执行
PostgreSQ L 与ANSI SQL标准相应,也定义了四种隔离级别。但由于使用了快照读 SI(Snapshot Isolation)
,RU
和 RC
实际上在 PostgreSQL 中没有任何区别。
并且得益于快照读, RR
级别下也没有幻读问题。RR
级别下连 \d
命令都看不到别的事务对表结构的修改。
但 RR
级别下可能产生阻塞、串行化失败等问题。比如
再比如对同一行数据进行修改,会报串行失败的错:
在 RC
级别下,这种操作则会导致阻塞。这种情况可以用 SELECT FOR UPDATE
语法解决。
其中事务2的 SKIP LOCKED
会因事务1上锁而 SELECT
不出任何数据,直接跳过更新。
因此 PostgreSQL 仍然提供 Serialzable
级别。
Read Uncommitted
Not Possible
Possible
Possible
Possible
Read Committed
Not Possible
Not Possible
Possible
Possible
Repeatable Read
Not Possible
Not Possible
Not Possible
Possible
Serializable
Not Possible
Not Possible
Not Possible
Not Possible