database - 前向乐观并发控制的正确性
问题描述
我正在学习数据库中的 OCC,前向 OCC 算法需要一个事务来验证所有并行运行但仍处于读取阶段的事务。我很困惑为什么它可以确保提交顺序保持序列化(COCSR,这意味着等效的序列化顺序与提交顺序相同)。
其实,我可以举一个这样的反例:
tx1: |--r(x)---|--validation--|------w(y)----|
tx2: |----r(z)----------r(y)----------|
的验证tx1
将通过,因为在其验证阶段它看不到r(y)
of tx2
。tx2
是一个只读事务,因此它不需要验证阶段。(算法来自《交易信息系统》一书)
但是,tx1
之前提交tx2
但tx2
看不到tx1
写入的值。这与 COCSR 的定义相矛盾,为什么?
解决方案
验证写入阶段是一个关键部分。当一个线程处于 val-write 阶段时,没有其他线程可以进行任何读/写操作。
tx1: |--r(x)---(--验证---w(y)-)----|
tx2: |----r(z)------------------------------r(y)----- --|
推荐阅读
- c - ANSI C 用来控制外部应用程序?
- django - pandas-对列中具有相同值的连续行进行分组和聚合
- android - 如何使用 Lottie 动画文件作为滑动的占位符
- excel - 数据模型 powerpivot 中的关系
- php - 为什么我的 Laravel 在删除级联上不起作用?
- django - Django 休息框架日期时间字段不会验证空字符串
- outlook - 是否有任何替代 RDO.Session - Outlook Redemption dll
- excel - SUMPRODUCT 在带有数字和字符的范围内
- c# - 如何使用c#获取活动目录用户的不可变ID
- php - Wordpress:类别提要中缺少最新帖子