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