在线测试
Project #4 - Concurrency Control
以下是Project #4的网址,2022FALL的Project #4是实现并发控制,可以分为以下三个任务:
- 我们首先需要实现一个锁管理器,能够支持 READ_UNCOMMITED、READ_COMMITTED、REPEATABLE_READ 三个隔离级别,以及相应的上锁解锁;
- 其次我们需要实现死锁检测,并能够中止最年轻的事务;
- 最后我们需要对 Project 3 中实现的 SeqScanExecutor 、InsertExecutor 、DeleteExecutor 三个算子进行改进,使其能够支持相应的上锁解锁以实现不同的隔离级别。
我们首先需要明确, Bustub 中的锁管理器通过 2PL 实现并发控制,其中的三种隔离级别分别为:
- REPEATABLE_READ(可重复读):这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。
- READ_COMMITTED (读已提交):这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。
- READ_UNCOMMITTED(读未提交):在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。
他们的性能依次更好但是一致性依次更差,分别可能会出现以下三个问题:
- 脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
- 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
- 幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
此外,Bustub 中的锁管理器支持 table 和 row 两种粒度,S、X、IS、IX、SIX 五种锁类型:
- S锁(共享锁):加了S锁的记录,允许其他事务再加S锁,不允许其他事务再加X锁