Concurrency 乐观与多版本并发控制-差异?

Concurrency 乐观与多版本并发控制-差异?,concurrency,database-replication,Concurrency,Database Replication,我试图找出乐观并发控制(OCC)和多版本并发控制(MVCC)之间的区别是什么 到目前为止,我知道这两者都是基于版本检查的更新 在OCC中,我读到了一些事务,这些事务没有获取读取访问的锁,只有在版本增加且版本检查失败的情况下,更新才会失败。在这种情况下,事务将回滚 在MVCC中,它是否基本相同?区别在哪里?我认为它们有时可以互换使用,如果事务只涉及一个对象,那么它们本质上是相同的,但MVCC是乐观并发(或其版本)的扩展,在涉及多个对象时提供保证。 假设你有两个对象,A和B,它们之间必须保持某种不变

我试图找出乐观并发控制(OCC)和多版本并发控制(MVCC)之间的区别是什么

到目前为止,我知道这两者都是基于版本检查的更新

在OCC中,我读到了一些事务,这些事务没有获取读取访问的锁,只有在版本增加且版本检查失败的情况下,更新才会失败。在这种情况下,事务将回滚


在MVCC中,它是否基本相同?区别在哪里?

我认为它们有时可以互换使用,如果事务只涉及一个对象,那么它们本质上是相同的,但MVCC是乐观并发(或其版本)的扩展,在涉及多个对象时提供保证。 假设你有两个对象,A和B,它们之间必须保持某种不变,例如,它们是两个和为常数的数字。现在,一个事务T1从a中减去10并将其加到B,同时,另一个事务T2正在读取这两个数字。 即使你乐观地独立地更新A和B(CAS他们),T2也可能会得到两个数字的不一致视图(比如,如果它在修改前读取A,但在修改后读取B)。MVCC将通过可能返回a和B的旧值来确保T2读取a和B的一致视图,即它必须保存旧版本


综上所述,乐观锁(或乐观并发控制)是同步的一般原则。MVCC是一种乐观技术,它允许跨多个对象的独立事务。

为了直接回答这个问题,多版本并发控制(MVCC)是一种并发控制方法,(通常)属于乐观并发控制(OCC)

有两种主要的并发控制方法:

  • 悲观并发控制:这种方法假设冲突操作发生得更频繁(这就是为什么称之为悲观)。由于冲突是常见的,这种方法使用锁来防止冲突操作的执行,前提是它们的使用没有显著的开销
  • 乐观并发控制:这种方法假设冲突操作很少,并且不会频繁发生。在这种假设下,锁会对性能造成显著的开销,而不是必要的开销。因此,这种方法通常避免锁定并尝试执行操作,检查(在提交每个事务时)在其操作期间是否与另一个事务发生冲突。如果存在任何冲突,此方法将中止具有冲突操作的事务
悲观并发控制的一个广为人知的算法是

乐观并发控制的两种广为人知的算法是:

这两种算法之间的主要区别如下。基于时间戳的算法为每个对象分配一个时间戳(更准确地说,每种操作都有一个),表示访问它的最后一个事务。因此,如果每个事务与访问该对象的最后一个事务冲突,则在操作期间进行检查。多版本方法维护每个对象的多个版本,每个版本对应于一个事务。因此,多版本方法比第一种方法具有更少的中止,因为潜在冲突的事务可以编写新版本,而不是在某些情况下中止。但是,这是以所有版本都需要更多存储为代价的


严格来说,MVCC主要关注数据的存储方式,即每个数据项可以有多个物理版本。因此,理论上也可以将其与悲观方法(例如锁定)结合起来,但其多版本特性最好与乐观方法结合起来。

仅纠正Dimos的回答:基于时间戳的并发控制仍然是一种悲观方法(在执行阶段,它可能仍会中止/阻止事务).

是的,MVCC是数据库引擎、缓存等使用的一种实现机制,用于提供独立的读取,而不会被写入阻塞。@Binil Thomas是的,occ的用途与我所理解的相同。这就是为什么会出现这样的问题:)