V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JasonLaw
V2EX  ›  数据库

如何证明“Serializable Snapshot Isolation 能够保证 Serializability”?

  •  
  •   JasonLaw · 2021-10-20 07:22:15 +08:00 · 888 次点击
    这是一个创建于 1150 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假设数据库只有 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”?

    1 条回复    2021-10-20 11:00:59 +08:00
    zhengxiaowai
        1
    zhengxiaowai  
       2021-10-20 11:00:59 +08:00
    分析的没错:SSI 保证 Serializability 就是排除掉异常情况

    我记得在工程实现上是用了一个什么图模型,然后判断是否有环,只有有环就是异常情况,直接取消事务这么来保证 Serializability 的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4866 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 03:41 · PVG 11:41 · LAX 19:41 · JFK 22:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.