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

时间:2011-04-22 00:44:43

标签: concurrency database-replication

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

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

在OCC中,我读到了没有锁定读取访问权限的事务,只读取了以后的更新,如果版本增加且版本检查失败,则更新失败。在这种情况下,交易将被回滚。

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

3 个答案:

答案 0 :(得分:16)

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

总而言之,乐观锁定(或乐观并发控制)是无锁同步的一般原则。 MVCC是一种乐观的技术,它允许跨越多个对象的孤立事务。

答案 1 :(得分:8)

要直接回复此问题, 多版本并发控制(MVCC)是一种并发控制方法,属于乐观并发控制(OCC)类别 。 / p>

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

  • 悲观并发控制 :这种方法假设冲突操作更频繁地发生(这就是为什么它被称为悲观)。由于冲突是常见的,因此这种方法利用锁来防止冲突操作的执行,假设它们的使用没有明显的开销。
  • 乐观并发控制 :这种方法假定冲突操作很少见,并且不会经常发生。在这种假设下,锁将会产生重大影响。不需要开销的性能。出于这个原因,这种方法通常避免锁定并尝试执行操作,检查(在每个事务的提交时),在其操作期间是否与另一个事务发生冲突。如果存在任何冲突,则此方法将中止具有冲突操作的事务。

一种广为人知的悲观并发控制算法是2-phase locking

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

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

答案 2 :(得分:0)

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