CMU_15445_Project4_BonusTask_Serializable_Verification

news/2025/3/22 11:31:38/文章来源:https://www.cnblogs.com/wevolf/p/18786369

Serializable Verification

我们知道 MVCC 并不能解决幻读以及写偏差的问题, 仅通过 MVCC 的事务调度是无法保证数据库引擎的 ACID 原则的, 那么为了保证数据库的 ACID 原则, 即使在调度的过程中无法保证, 可以通过在 Commit 的时候, 通过验证, Abort 可能造成写偏差于幻读的事务, 从而避免这些冲突, 完成事务执行的序列化隔离(serializable isolation level), 请注意这并不是冲突可序列化, 而是在事务提交的时候验证删选掉冲突的事务, 保证数据库从结果上来说是 ACID.

OCC (Optimistic Concurrency Control)

BUSTUB 使用的是 OCC backward validation 序列化验证方法. 由于 BUSTUB 是动态数据库, 允许增删改查, 允许各种操作, 因此需要考虑插入, 删除, 以及更新的操作. 因此对于每一个将要提交的事务, 需要存储其 Scan Fliter 与 Write Set. 当前有了所有信息(Read Set, Write Set, 版本链等), 我们可以通过检查扫描谓词(Read Set)是否与当前事务开始后其他已提交事务的 Write Set 存在交集, 从而进行可序列化的验证. 每次事务 Txn_A 将要提交的时候, 需要进行以下的验证过程:

  1. 如果 Txn_A 是只读事务, 无需验证, 在 BUSTUB 中仅验证, UPDATE, DELETE, 和 INSERT, 因为只读事务不会对版本链造成修改, 从 OCC 的角度来说, 不会影响事务的隔离性.
  2. 遍历在 Txn_A 的 read timestamp 时间戳后 Commit 的所有事务, 这些事务的集合为 "conflict transactions", 表示可能存在冲突的事务
  3. 收集 "conflict transactions" 修改的 tuples 的 RIDS.
  4. 对于步骤 3 中的 RIDS 集合, 遍历每一个对应的 tuple 的版本链, 判断与当前将要提交的事务 Txn_A 之间是否存在幻读. 这个过程需要从当前时候想 Txn_A 的 read timestamp 开始遍历版本链, 回放其他事务的更新流程, 检查是否存在冲突.
    我们详细解释一下上述的步骤 4 可能存在冲突, 从而 Abort 事务 Txn_A 的情况:
    我们遍历 Write Set 的 tuples 中的每一个 tuple 的版本链
  • 如果一个 tuple 是新插入的, 需要判断这个新插入的 tuple 是否满足当前事务的 Scan Fliter, 我们可以用下图来解释这种情况.
    img
    可以看到, 图中的 Scan Fliter 是 col2=8, Txn1 的 read_ts 为 2, 它开始的时候, 是不会读取到这个 tuple 的, 但是 Txn2 插入了 (B,8), 并且成功 Commit 了, 按照事务的序列化执行标准, 事务 Txn1 Commit 的时候应该读取这个 (B,8) 并且修改为 (A,4), 但是按照 MVCC 版本链的控制, 是不会读到新插入的 Tuple 的, 因此当前事务 Txn1 Abort.

需要 Abort 的情况

scan predicate(read set): 当前将要 Commit 的事务在执行过程中读过的所有 tuples 对应的 RIDs 集合.
conflict transactions: 当前将要 Commit 的事务的 read_ts_ 之后 Commit 的所有事务的集合

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/903418.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用低代码平台设计UI

由于自己不是专业的设计师,就自己简单画个UI界面,那么就可以用到下面的低代码平台 http://120.92.142.115:81/vform3/ 里面可以选择体验vue3模板 进入下面图中的设计界面可以自己拖动组件 修改组件展示给用户的标签名称 以及数据传输时发送的字段名称 可以设置是否必填 默认值…

使用 Hosting 构建 WPF 程序 - prism 篇

WPF + .NET Generic Host + Prism + CommunityToolkit.Mvvm在 使用 Hosting 构建 WPF 程序 - Stylet 篇 中,使用 Hosting + Stylet 的方式,构建了一个 WPF 框架, 本文用于记录使用 .NET Generic Host + Prism 构建 WPF 所需的修改,仅供参考。 示例代码:Jasongrass/Demo.Ap…

如何构建一个用于3D扫描的电动转台

在这个项目中,我将向您展示如何构建一个用于3D扫描的电动转台。这个DIY项目由三个主要部分组成:顶板、中央齿轮驱动板和底座。顶板保持静止,作为放置待扫描物体的平台。在设计的核心,中间板的特点是一个内部齿轮机构,隐藏在视线之外,这是由一个步进电机驱动。这个齿轮板旋…

【每日一题】20250322

【每日一题】 1.(18分) \(\hspace{0.7cm}\)I.(5分)根据单摆周期公式 \(\displaystyle T=2\pi\sqrt{\frac{l}{g}}\),可以通过实验测量当地的重力加速度.如图 \(1\) 所示,将细线的上端固定在铁架台上,下端系一小钢球,就做成了单摆.\(\hspace{0.7cm}\)(1)用游标卡尺测…

Git 和 GitHub 笔记

笔记说明 该笔记记录所有我使用 Git 和 GitHub 过程中遇到的、觉得需要记录的事情。复杂的问题按需抽出来单独称为一篇笔记,换成博客链接。 修改远程仓库名字后,本地仓库做什么处理? git remote -v git remote set-url origin https://github.com/用户名/新仓库名.git or gi…

外设驱动库开发笔记55:MAX31865热电阻变送器驱动

外设驱动库开发笔记55:MAX31865热电阻变送器驱动热敏电阻(RTD)作为一种高精度的温度传感器,在工业控制、医疗设备和实验室测量等领域有着广泛的应用。MAX31865是Maxim Integrated推出的一款专为RTD设计的信号调理器,能够简化RTD的温度测量过程。本文将详细介绍如何设计一个…

【20250322】热烈庆祝《青猪》系列第二季定档7月

www七年终于等来了 初中的时候还经常在班上跟同学聊这番好耶!考个好成绩,暑假一边学CSAPP一边看!

异常--java进阶day08

1.异常 java中,所有的异常都是类2.异常的体系结构3.编译时异常与运行时异常 1.编译时异常 语法完全正确,但是代码就是会报错,如下图上图中,写的是时间格式化类的使用,parse方法将给的字符串变为时间类对象 明明语法正确,但是系统就是会报错,这就是编译时异常 原因很简单…

leetcode每日一题:监控二叉树

引言 ​ 今天的每日一题原题是2643. 一最多的行,直接模拟,切除和最大的一行即可。更换成前几天遇到的更有意思的一题来写这个每日一题。 题目 968. 监控二叉树 给定一个二叉树,我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计…

Ubuntu安装GPU驱动+CUDA+cuDNN的安装方法

一台有GPU的虚拟机如果没有安装CUDA的驱动,是需要我们手动去进行安装的,介绍Ubuntu操作系统的安装教程。 1. 下载安装文件 NVIDIA CUDA Toolkit Archive 点击上面链接,进入CUDA Toolkit Archive,下载需要的CUDA工具包,本文章以CUDA Toolkit 12.3.2版本举例(可能需要代理加…

[多项式学习笔记] 拉格朗日插值

[多项式学习笔记] 拉格朗日插值[多项式学习笔记] 拉格朗日插值 多项式插值 给定 \(x\) 坐标两两不同的 \(n + 1\) 个点,能够唯一确定一个 \(n\) 次多项式。从给定点求出多项式的过程称为插值。 具体而言,给定 \(n + 1\) 个点 \((x_0, y_0), (x_1, y_1), \cdots, (x_n, y_n)\)…

flutter:bottomNavigationBar+PageView切换页面,使页面可以滑动切换

一,代码: tabbar: import package:flutter/material.dart; import ../tabpages/MyHomePage.dart; import ../tabpages/ProfilePage.dart;class MyTabBar extends StatefulWidget {const MyTabBar({super.key});@overrideState<MyTabBar> createState() => _MyTabBar…