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

chr*_*zer 17 concurrency database-replication

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

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

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

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

pro*_*ron 17

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

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


Dim*_*mos 10

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

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

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

一种广为人知的悲观并发控制算法是2阶段锁定.

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

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