😉Concurrency Control
PROJECT #4 - CONCURRENCY CONTROL
Last updated
PROJECT #4 - CONCURRENCY CONTROL
Last updated
这个 project 主要是实现数据库的锁管理(Lock Manager),并且支持并发查询执行。LM 负责管理事务发出的 tuple-level 锁,并且 LM 还有基于事务的隔离级别实现 Shared & Exclusive 锁的授予和释放。
下面主要是 LM 需要实现的函数的思路,注意每个调用下面的每个函数应该先获得 LM 的 latch_
。
为了检测死锁的事务,首先应该构建一个 wait for graph。
然后运行 DFS 判断环的算法检测图中是否存在环。
如果发现死锁的事务,将它 Aborted 后,如何通知其他事务继续获得 tuple-lock 呢?这里采用了群友提供的思路
进入条件变量等待时,使用哈希表保存
txn_id_t -> RID
的映射。找到死锁节点后,设置为 Aborted,唤醒
txn_id_t
对应的 RID 请求队列,唤醒后进行状态检查。如果事务的状态的 Aborted,那么抛出异常。
对于 SeqScan:如果隔离级别是 READ_UNCOMMITTED
,则不需要加锁;如果隔离级别是 READ_COMMITTED
和 REPEATABLE_READ
,则访问某个 RID 时需要对它加 S-Lock
对于 Delete 和 Update:如果当前 RID 拥有 S-Lock
,则需要将 S-Lock
升级为 X-Lock
,否则对这个 RID 加 X-Lock
测试
格式验证
打包
然后前往 https://www.gradescope.com 提交代码