我想知道,乐观并发控制 (OCC) 和多版本并发控制 (MVCC) 之间的区别是什么?
到目前为止,我知道两者都是基于更新的版本检查。
在 OCC 中,我读到了没有获取读取访问锁的事务,仅适用于以后的更新,如果在版本增加和版本检查失败之间,该更新将失败。在这种情况下,事务将被回滚。
在MVCC中,基本是一样的,还是不行?区别在哪里?
最佳答案
我认为它们有时可以互换使用,如果事务只涉及一个对象,那么它们本质上是相同的,但 MVCC 是乐观并发(或它的一个版本)的扩展,它在涉及多个对象时提供保证。
假设您有两个对象 A 和 B,它们必须在它们之间保持一些不变性,例如它们是总和为常数的两个数。现在,事务 T1 从 A 中减去 10 并将其添加到 B,同时,另一个事务 T2 正在读取这两个数字。
即使您乐观地独立更新 A 和 B(CAS 它们),T2 也可能会得到这两个数字的不一致 View (例如,如果它在修改前读取 A,但在修改后读取 B)。 MVCC 将通过可能返回它们的旧值来确保 T2 读取 A 和 B 的一致 View ,即它必须保存旧版本。
综上所述,乐观锁(或乐观并发控制)是无锁同步的一般原则。 MVCC 是一种乐观技术,它允许跨越多个对象的隔离事务。
关于concurrency - 乐观与多版本并发控制 - 差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5751271/