假设数据库只有 read 和 write 两种命令,每个事务只会执行两个命令。
transaction 1 |
transaction 2 |
rr |
rr |
rw |
rw |
wr |
wr |
ww |
ww |
那么如果 transaction 1 执行的是 rr,那么 transaction 2 可能执行{rr, rw, wr, ww}中的一个,以此类推。
- r₁(x)r₁(x) & r₂(x)r₂(x) - 不管怎么并发执行,都可以得到和顺序执行一样的结果。
- r₁(x)r₁(x) & r₂(x)w₂(x) - SSI 允许 r₁(x)r₂(x)r₁(x)w₂(x),而且它所执行的结果和 r₁(x)r₁(x)r₂(x)w₂(x)一样,所以保证了 Serializability ; SSI 避免了 r₁(x)r₂(x)w₂(x)r₁(x)的发生,因为 w₂(x)会使第一个 r₁(x)变得 stale,而且 r₁(x)r₂(x)w₂(x)r₁(x)无法得到和顺序执行一样的结果,所以保证了 Serializability 。
- r₁(x)r₁(x) & w₂(x)r₂(x) - SSI 避免了 r₁(x)w₂(x)r₁(x)r₂(x)的发生,因为 w₂(x)会使第一个 r₁(x)变得 stale,而且 r₁(x)w₂(x)r₁(x)r₂(x)无法得到和顺序执行一样的结果,所以保证了 Serializability 。r₁(x)w₂(x)r₂(x)r₁(x)同理。
- r₁(x)r₁(x) & w₂(x)w₂(x) - SSI 避免了 r₁(x)w₂(x)r₁(x)w₂(x)的发生,因为第一个 w₂(x)会使第一个 r₁(x)变得 stale,而且 r₁(x)w₂(x)r₁(x)w₂(x)无法得到和顺序执行一样的结果,所以保证了 Serializability 。r₁(x)w₂(x)w₂(x)r₁(x)同理。
是不是通过这种方式就可以证明“Serializable Snapshot Isolation 能够保证 Serializability”?