美文网首页
MySQL InnoDB Read-Modify-Write l

MySQL InnoDB Read-Modify-Write l

作者: simplehippo | 来源:发表于2019-07-14 22:56 被阅读0次

执行路径和发生场景

执行路径

当执行 Read-Modify-Write cycle时,有可能会发生lost update。 论文《A Critique of ANSI SQL Isolation Levels》定义lost update的执行路径是 r1[x] w2[x] w1[x] c1。一种可能引发lost update的事务顺序为 r1[x=100] r2[x=100] w2[x=120] w1[x=130] c2 c1, 即

  1. 事务1 读 x
  2. 事务2 读 x
  3. 事务2 将 x 更新为 120
  4. 事务1 将 x 更新为 130
  5. 事务2 提交
  6. 事务1 提交

即使事务2成功提交了,事务2的更新依然被事务1 over write,导致更新丢失。

发生场景

  • 数据库中计数列(maxno, count)
  • 多用户同时编写同一份文档(wiki, source code)

避免方法

select for update

在事务1读 x 时为该行记录加锁,事务2读取 x 时会被阻塞,直到事务1结束或者事务2因等待时间过长返回 lock wait timeout。

serializable

将事务的 isolation leve l设置为 serializable 也可以防止因并发出现的 lost update。InnoDB 使用 2PL( two-phase locking ) 实现 serializable。2PL 算法要点如下:

  • 事务 A 读 x 之后,其它事务尝试写 x 时必须等待事务 A 提交或中止
  • 事务 A 写 x 之后,其它事务尝试读 x 时必须等待事务 A 提交或中止

当执行到步骤3时,事务 2 会被阻塞,等待事务 1 提交或终止。当执行到步骤 4 时,事务 1 也需要等待 事务 2 提交或终止。 这样,InnoDB检测到死锁后中止事务1。接下来事务2更新 x 成功并提交。

其他数据库

PostgreSQL repeatable read, SQL Server snapshot isolation 能自动检测到 lost update。 Oracle 在 serializable 级别提供对 lost update 的检查

参考文献

  1. Kleppmann, M. (2017). Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems
  2. Berenson, H., Bernstein, P., Gray, J., Melton, J., O’Neil, E., & O’Neil, P. (2007). A Critique of ANSI SQL Isolation Levels. ArXiv Preprint ArXiv:Cs/0701157.

相关文章

网友评论

      本文标题:MySQL InnoDB Read-Modify-Write l

      本文链接:https://www.haomeiwen.com/subject/falwkctx.html