CMU_15445_P3_bustub_事务与锁管理机制

CMU_15445_P3_bustub_事务并发控制算法(MVCC)

BUSTUB 数据库引擎采用多版本并发控制协议 multi-version concurrency control (MVOCC) 来实现事务的并发控制管理.

数据引擎的并发控制

从数据库引擎的角度应该如何看待以及处理事务呢?
事务的本质是外部 Client 对数据库 Server 的请求, 数据库引擎需要合理的处理以及调度这些请求,保证这些请求获取到的数据的正确性以及数据库内部存储数据本身的正确性.
更加具体的说, 我们可以将数据库看作是数据对象 \((A, B, C)\) 的集合, 这些数据对象可以是 属性, 元组, 页, 表, 或者整个数据库. 事务操作的对象可以是这些数据对象中的任何一种, 但在特定的讨论中, 所有事务必须作用于相同类型的对象.

事务的定义

事务是一系列对数据库对象的 读(Read, R) 和 写(Write, W) 操作. 例如:
R(A) 代表读取对象 A 的值.
W(B) 代表修改对象 B 的值.

事务的边界与执行

事务的开始和结束由客户端(用户或应用程序)定义. 在SQL中:
BEGIN 语句标志着一个事务的开始.
COMMIT 语句表示事务成功完成, 所有更改被永久保存到数据库.
ABORT(或 ROLLBACK)表示事务失败, 所有更改都会被撤销, 就像事务从未发生过一样.
事务的执行结果:
提交(Commit): 事务的所有修改要么全部应用到数据库, 要么(如果数据库管理系统 DBMS 决定回滚)不应用任何修改.
中止(Abort): 事务的所有修改都被撤销, 使数据库回到事务开始前的状态. 中止可能是事务自身引发的(例如程序错误), 也可能是DBMS决定的(如发生死锁、数据完整性问题等).

数据库 DBMS 的 AICD 特性

数据库管理系统(DBMS)为了保证事务的正确性, 需要满足 ACID 四个特性:

原子性(Atomicity):

事务的原子性是值事务的所有操作要么全部执行成功, 要么全部不执行(回滚).
例如:在银行转账中, 如果从账户 A 扣款成功但未能存入账户 B, 则整个事务必须回滚.

一致性(Consistency):

事务的执行不会破坏数据库的一致性.
一致性通常与约束(Constraints)、级联(Cascades)和触发器(Triggers)相关, 例如:一个事务不能导致银行账户余额变成负数(如果有“余额>=0”的约束).

隔离性(Isolation):

事务执行时, 它应该像是唯一运行的事务, 不受其他事务的干扰.
例如:如果两个用户同时查询和修改同一张表, 它们的操作不能相互影响, 否则可能导致数据不一致.

持久性(Durability):

事务一旦提交, 即使发生系统崩溃, 修改也必须被永久存储.
DBMS 通过日志(Write-Ahead Logging, WAL)、检查点(Checkpointing)等机制保证数据不会丢失.

串行调度与可串行化

在不考虑并发以及隔离性的情况下, 数据库对事务处理的基本方法是串行调度, 一个串行调度是指所有事务按照某个顺序依次执行, 且不会有事务交错执行, 因此没有事务并发.
然而数据库实际实现中, 为了提示性能, 一定是并发调度的, 并发调度的可串行化是指: 一个并发调度是可串行化(Serializable)的, 当且仅当它的执行结果与某个串行调度等价.

可串行化是对并发调用的一种约束, 通常分为冲突可串行化(Conflict Serializability) 与视图可串行化(View Serializability).

冲突可串行化(Conflict Serializability)

冲突等价: 两个调度是冲突等价的当且仅当在两个调度中, 包含相同的事务, 并且每个事务执行相同的操作(读/写相同的数据库对象), 在两个调度中, 所有冲突操作的执行顺序相同.
假设有两个事务:
T1: 读取 A, 修改 A
T2: 读取 A, 修改 A
有两个调度:

T1: R(A)
T2: R(A)
T1: W(A)
T2: W(A)

T2: R(A)
T1: R(A)
T1: W(A)
T2: W(A)

我们可以观察到上面示例中存在写冲突, 但是观察 W(A) 的顺序:
在 S1 中: T1 先写, T2 后写
在 S2 中: T1 先写, T2 后写(顺序没变).
所以 S1 和 S2 是 冲突等价的.
冲突等价的意义: 如果两个调度是冲突等价的, 则它们的执行结果在数据库中是相同的. 因此, 如果某个调度可以通过交换非冲突操作变成串行调度, 则它是冲突可串行化(Conflict Serializable)的.
冲突可串行化可以通过有向无环图来判断, 如果一个调度中的事务与事务之间的冲突构成一个有向无环图(DAG), 那么该调度的冲突是可串行化的.

视图可串行化(View Serializability)

视图可串行化是指如果一个调度 S 不能通过交换操作变为某个串行调度, 但它与某个串行调度的数据库最终状态相同, 则该调度是视图可串行化的(View Serializable). 视图可串行化难以检测和强制执行, 因为 DBMS 需要判断事务的执行逻辑, 而不仅仅是操作顺序. 由于计算复杂度较高, 实际数据库通常不使用.

posted @ 2024-12-02 10:18  虾野百鹤  阅读(104)  评论(0)    收藏  举报