我想知道,乐观并发控制(OCC)和多版本并发控制(MVCC)有什么区别?
到目前为止,我知道两者都是基于版本检查更新。
在 OCC 中,我读到了关于读取访问没有获取锁的事务,仅用于以后的更新,如果在版本增加和版本检查失败之间,该更新将失败。在这种情况下,事务将被回滚。
在MVCC中,基本一样,还是不一样?区别在哪里?
我想知道,乐观并发控制(OCC)和多版本并发控制(MVCC)有什么区别?
到目前为止,我知道两者都是基于版本检查更新。
在 OCC 中,我读到了关于读取访问没有获取锁的事务,仅用于以后的更新,如果在版本增加和版本检查失败之间,该更新将失败。在这种情况下,事务将被回滚。
在MVCC中,基本一样,还是不一样?区别在哪里?
我认为它们有时可以互换使用,如果事务只涉及一个对象,那么它们本质上是相同的,但 MVCC 是乐观并发(或它的一个版本)的扩展,它在涉及多个对象时提供保证。假设你有两个对象,A 和 B,它们必须保持它们之间的一些不变性,例如它们是两个总和为常数的数字。现在,事务 T1 从 A 中减去 10 并将其添加到 B,同时,另一个事务 T2 正在读取这两个数字。即使您乐观地独立更新 A 和 B(对它们进行 CAS),T2 也可能会得到这两个数字的不一致视图(例如,如果它在修改之前读取 A,但在修改后读取 B)。MVCC 将通过可能返回它们的旧值来确保 T2 读取 A 和 B 的一致视图,即
总而言之,乐观锁定(或乐观并发控制)是无锁同步的一般原则。MVCC 是一种乐观技术,它允许跨多个对象的隔离事务。
直接回答问题,多版本并发控制(MVCC)是一种并发控制方法,(通常)属于乐观并发控制(OCC)的范畴。
有两种主要的并发控制方法:
一种广为人知的悲观并发控制算法是两阶段锁定。
两种广为人知的乐观并发控制算法是:
这两种算法之间的主要区别如下。基于时间戳的算法为每个对象分配一个(更准确地说是为每种操作,读取和写入)时间戳,表示访问它的最后一个事务。因此,每个事务在操作期间都会检查它是否与访问对象的最后一个事务冲突。多版本方法维护每个对象的多个版本,每个版本对应一个事务。因此,与第一种方法相比,多版本方法的中止次数更少,因为潜在冲突的事务可以编写新版本,而不是在某些情况下中止。但是,这是以所有版本都需要更多存储为代价的。
严格来说,MVCC 主要关注数据的存储方式,即每个数据项可以有多个物理版本。因此,理论上也可以将其与悲观方法(例如锁定)结合使用,但其多版本特性最好与乐观方法结合使用。
只是为了纠正 Dimos 的回答:基于时间戳的并发控制仍然是一种悲观的方法(它可能仍然在执行阶段中止/阻止事务)。