less than 1 minute read

Isolation level与事务中的问题

这个应该已经很熟了。

RU, RC, RR, Serializable

Dirty read (读到其他事务未提交的更改),

Non-repeatable read(读到其他事务提交或未提交的更改),

Phantom read(条件查询的结果受到其他事务的影响,产生不一致)。

以上是课堂内容,实际上还有一个

Serialization anomaly(执行结果不符合serializable要求,即任何串行的执行顺序都不可能导致该结果)。

举个例子:比如说一个accounts表,有owner和balance两列。

执行insert into accounts (owner, balance) select 'sum', sum(balance) from accounts;

在RR级别下由于是快照,两个事务同时进行该操作的话会产生两个balance一样的sum行,而如果是串行操作不可能出现此情况。

理论上的对应关系

RU:所有问题都有

RC:避免Dirty Read

RR:还避免了NR Read

Serializable:还避免了Phantom Read

MySQL

默认RR

RU:所有问题都有

RC:避免Dirty Read

RR:还避免了NonRepeatable Read和Phantom Read(间隙锁)

Serializable:还避免了Serialization anomaly(通过锁实现,表现为死锁并拒绝其他并行事务)

Postgres

默认RC

RU:相当于RC

RC:避免Dirty Read

RR:还避免了NonRepeatable Read和Phantom Read

Serializable:还避免了Serialization anomaly(通过判断依赖实现,表现为暂时拒绝其他并行事务,当其他事务commit后重试可以成功)