CMU15-445 Project.4总结

我们利用 txn_set_ 表示所有已获得运行许可的线程节点集合,利用 safe_set_ 表示已经遍历完所有邻居节点的节点,利用 active_set_ 表示尚有邻居节点未遍历完的节点。若我们在遍历邻居节点时遍历到了 active_set_ 中的节点说明图中存在环,若为遍历到则递归调用函数并判断其邻居节点出发是否会出现环。我们按照 tid 从大到小的顺序来遍历每一个节点,这样就就能够确保当我们需要删除造成死锁的节点时,我们优先删除的是 tid 最大的事务,也就是最年轻的事务。通知正在阻塞的相关事务。
摘要由CSDN通过智能技术生成

在线测试
在这里插入图片描述

Project #4 - Concurrency Control

以下是Project #4的网址,2022FALL的Project #4是实现并发控制,可以分为以下三个任务:

  1. 我们首先需要实现一个锁管理器,能够支持 READ_UNCOMMITED、READ_COMMITTED、REPEATABLE_READ 三个隔离级别,以及相应的上锁解锁;
  2. 其次我们需要实现死锁检测,并能够中止最年轻的事务;
  3. 最后我们需要对 Project 3 中实现的 SeqScanExecutor 、InsertExecutor 、DeleteExecutor 三个算子进行改进,使其能够支持相应的上锁解锁以实现不同的隔离级别。

我们首先需要明确, Bustub 中的锁管理器通过 2PL 实现并发控制,其中的三种隔离级别分别为:

  1. REPEATABLE_READ(可重复读):这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。
  2. READ_COMMITTED (读已提交):这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。
  3. READ_UNCOMMITTED(读未提交):在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。

他们的性能依次更好但是一致性依次更差,分别可能会出现以下三个问题:

  1. 脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
  2. 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
  3. 幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
    在这里插入图片描述

此外,Bustub 中的锁管理器支持 table 和 row 两种粒度,S、X、IS、IX、SIX 五种锁类型:

  1. S锁(共享锁):加了S锁的记录,允许其他事务再加S锁,不允许其他事务再加X锁
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值