数据库(四) 数据库事务
本文最后更新于:2023年2月28日 下午
数据库事务 (Transaction),多条SQL语句的整体。以满足多条SQL语句全部执行成功、或全部撤销的现实需求。
1. 事务的ACID特性
-
A:Atomicity,原子性
事物具有原子性,要么全部执行,要么全部不执行
-
C:Consistency,一致性
事务完成后,所有相关数据的状态一致
-
I:Isolation,隔离性,
如果有多个事务并发执行,事务见互不干扰
-
D:Durability,持久性
事务完成后,对数据库数据的修改被持久化存储。
为保证事务的ACID特性,有以下机制:
-
Shadow-database scheme
- a pointer called
db_pointeralways points to the current consistent copy of the database. - all updates are made on the shadow copy of the database, and
db_pointeris made to point to the updated shadow copy only after the transaction reaches partially commit and all updated pages have been flushed to disk. - in case transaction fails, old consistent copy pointed to by
db_pointercan be used, and the shadow copy can be deleted.
- a pointer called
-
Concurrency control schemes
Concurrency-control schemes tradeoff between the amount of concurrency they allow and the amount of overhead that they incur.
Schedules must be conflict or view serializable, and recoverable, for the sake of database consistency, and preferably cascadeless.
Some schemes allow only conflict-serializable schedules to be generated, while others allow view-serializable schedules that are not conflict-serializable.
2. 事务的状态

- Active 活动的,初始状态,表示事务正在执
- Partially committed 部分提交的,事务中最后一个操作完成,但是还未存储至数据库
- Failed 失败的,事务处于活动或部分提交时出错无法继续执行,或人为停止当前事务提交
- Aborted 中止的,失败后完成回滚 (roll back) 操作后。此时,数据库恢复初始状态,事务将重新执行或杀死进程
- Committed 提交的,所有操作成功完成且数据库永久更新
3. 事务的并发
调度 (schedules)
事务在并发执行时,各个事务中的不同指令的先后执行顺序称为调度。
通常只考虑读 (read) 写 (write) 指令。

串行调度
串行调度 (serial schedules )
事务一个接一个的执行。在前一事务commit或者abort之前,后一事务不得执行。
是可恢复的(Recoverable)、无级联的(Cascadeless)、严格的(Strict)

可串行化调度
可串行化调度 (serializable schedules)
可串行化 (serializable):可等价于串行调度的调度为可串行化 (serializable)的,称为可串行化调度 (serializable schedules)
可串行化 (serializable) 分为:
- 冲突可串行化 (conflict serializability)
- 目标可串行化 (view serializability)。
冲突可串行化
冲突可串行化(conflict serializable)
冲突(conflict):若针对同一数据发出的两个指令属于两个事务,且至少一个指令为写指令。则此两个指令冲突
冲突等价(conflict equivalent):若调度
S可通过调换不冲突指令转换为调度S',则S和S'冲突等价冲突可串行化(conflict serializable):冲突等价于串行调度的非串行调度(non-serial schedules)为冲突可串行化的
优先图/前趋图(Precedence Graph):用于判断是否冲突可串行化,无环则为冲突可串行化
前趋(precede):冲突指令
opi与opj不能调换时,opi前趋于opj,事务i前趋于事务j
作优先图
以调度实例S1为例:

-
分别列出对各个数据的读写指令,找出冲突指令(属于不同事务/读写或写写)并作出前趋关系

-
得到事务间的前趋关系
1
2
3
4
5
6
7r2 -> w3 : 2 -> 3
w2 -> r3 : 2 -> 3
w2 -> w3 : 2 -> 3
r1 -> w2 : 1 -> 2
r2 -> w1 : 2 -> 1
w1 -> w2 : 1 -> 2 -
检查优先图是否有环

-
得出结论,本例是非冲突可串行化的
目标可串行化
目标可串行化(view serializable),又称视图可串行化
目标可串行化(view serializable):目标等价于串行调度的非串行调度(non-serial schedules)为目标可串行化的
目标等价(view equivalent):若两个调度是目标等价的,则其满足条件
Initial Read
初始(第一个)读指令均由相同事务执行
Updated Read
中间的读指令位于相同顺序的写指令后
Final Write
终极(最后一个)写指令均由相同事务执行
可串行化包括冲突可串行化和目标可串行化,冲突可串行化则一定目标可串行化。
示例

- Initial Read 均为
X->T1;Y->T1 - Final Write 均为
X->T2;Y->T2 - Updated Read 均为
W1(X)->R2(X);W1(Y)->R2(Y) - 得出结论,本例是目标可串行化的
可恢复/不可恢复调度
可恢复调度(recoverable schedule) & 不可恢复调度(irrecoverable schedule)
可恢复(recoverable):任一事务失败后,其他事务回滚中止
不可恢复(irrecoverable):某一事务失败后,其他事务中存在事务已提交不得回滚
可恢复的实现:对于每对事务
Ti和Tj,如果Tj读取了由Ti写过的数据项,则Ti提交应先于Tj提交
级联/无级联调度
级联调度(cascading schedule) / 级联回滚(cascading roll back) & 无级联调度(cascadeless schedule) / 无级联回滚(cascadeless rollback)
级联回滚(cascading roll back):一个事务的失败引发一系列事务的回滚(有多个事务读被失败事务写过的数据项)
无级联回滚(cascadeless rollback):不发生级联回滚
无级联回滚的实现:对于每对事务
Ti和Tj,如果Tj读取了由Ti写过的数据项,则Ti提交应先于Tj对于此数据项的读取
严格调度
严格调度(strict schedule)
当事务
Ti对于某数据项的写指令前趋于其冲突指令时,事务Ti也先于此事务提交的调度
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!
