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

标签 concurrency database-replication

我想知道,乐观并发控制 (OCC) 和多版本并发控制 (MVCC) 之间的区别是什么?

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

在 OCC 中,我读到了没有获取读取访问锁的事务,仅适用于以后的更新,如果在版本增加和版本检查失败之间,该更新将失败。在这种情况下,事务将被回滚。

在MVCC中,基本是一样的,还是不行?区别在哪里?

最佳答案

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

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

关于concurrency - 乐观与多版本并发控制 - 差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5751271/

相关文章:

google-cloud-datastore - Google Datastore 跨区域复制

ios - 我编写的由 GCD 代码支持的读写锁导致并行测试死锁

Haskell - 从句柄读取行而不阻塞

python - 在 Python 中使用 Multiprocessing+Threads 加速应用程序时遇到问题

java - java的内在对象锁有一个单独的关联条件对象是什么意思

cassandra 分片和复制

azure - 调整 Azure 地理复制数据库的大小

backup - 如何从mysql备份恢复slave?

c - Linux C 编程 : Concurrent reads/writes to same file descriptor