(一)四种特性
(二)四种调度
(1)串行调度:事务之间是相互独立,串行执行的,有明确的先后顺序。(eg.调度1、2)
(2)可串行化调度:在并发执行中,通过保证所执行的任何调度的效果等价于串行调度。(eg.调度3)
- 冲突可串行化(与串行调度冲突等价):优先图无环;(eg.调度3)
- 非冲突可串行化:优先图有环。(eg。调度4)
(3)可恢复调度:当事务发生故障时能够正常恢复到初始状态的调度,可恢复调度应满足: 对于每对事务和
,如果
读取了之前由
所写的数据项,则
先于
提交。
(4)无级联调度:避免级联回滚(因单个事务故障导致一系列事务回滚)发生的调度。无级联事务应满足:对于每对事务和
,如果
读取了之前由
所写的数据项,则
必须在
这一读操作之前提交。
(三)四种隔离性级别
(四)八种协议
(1)两阶段封锁协议(只有两个阶段)
- 增长阶段:事务可以获得锁,但不能释放锁;
- 缩减阶段:事务可以释放锁,但不能获得新锁。
两阶段封锁并不保证不会发生死锁和级联回滚。
(2)严格两阶段封锁协议:除了要求封锁是两阶段之外,还要求事务持有的所有排他锁必须在事务提交之后方可释放。
(3)强两阶段封锁协议:要求事务提交前不得释放任和锁。
严格两阶段封锁协议和强两阶段封锁协议避免了级联回滚。
(4)具有锁转换的两阶段封锁协议
- 升级(upgrade):从共享到排他的转换,只能发生在增长阶段;
- 降级(downgrade):从排他到共享的转换,只能发生在缩减阶段。
(5)树形协议
所有满足树形协议的调度不仅是冲突可串行化的,而且保证不会产生死锁。
但是树形协议不保证可恢复性和无级联回滚,为了保证可恢复性和无级联回滚,可以将协议修改为在事务结束之前不允许释放排他锁。
(6)多粒度封锁协议
在一个结点显示加锁之前,该结点的全部祖先结点均先加上了意向锁。因此,事务不必搜索整棵树就能判定能否成功给一个结点加锁。
- 共享型意向锁(IS):如果一个结点加上了IS锁,那么将在树的较低层进行显式封锁,但只能加共享锁(S)。(IS可理解为部分读,即该层的更底层存在某一部分可完全读(S)。)
- 排他型意向锁(IX):如果一个结点加上了IX锁,那么将在树的较低层进行显式封锁,可以加排他锁(X)或者共享锁。(IX可理解为部分读或部分读写,即该层的更底层存在某一部分可以完全读(S)或完全读写(X)。)
- 共享排他型意向锁(SIX):如果一个结点加上了SIX锁,那么以该结点为根的子树显式地加了共享锁,并且将在树的更底层显式地加排他锁。(SIX可理解为部分读写,即该层的更底层存在某一部分可以完全读写(X))
(7)时间戳排序协议
:事务
的时间戳。
- W-timestamp(Q):成功执行write(Q)的所有事务的最大时间戳。
- R-timestamp(Q):成功执行read(Q)的所有事务的最大时间戳。
时间戳排序协议保证冲突可串行化和无死锁,但并不能保证可恢复和无级联回滚。
(8)基于Thomas写协议的时间戳排序协议
协议中有关read操作的规则保持不变,在某些特定的情况下忽略过时的write操作。
(五)两种死锁处理
(1)死锁预防
- 方法一:要么一次全部封锁要么全部封锁。
- 方法二:使用抢占和事务回滚。
- 方法三:锁超时。若在此期间内未授予该事务锁,则称该事务超时,此时该事务自己回滚并重启。
(2)死锁预防和恢复
当且仅当等待图包含环时,系统中存在死锁。
从死锁中恢复:
- 方法一:选择牺牲者
- 方法二:回滚
- 方法三:饿死
(六)六个日志记录
(1):事务
对数据项
执行了一个写操作,写操作前
的值是
,写操作后
的值是
。
(2):补偿日志记录,其中
是在回滚中数据项
恢复成的值。
(3):事务
开始。
(4):事务
提交。
(5):事务
中止。
(6):检查点,其中
是执行检查点时正活跃的事务的列表。
(七)两种恢复算法
(1)系统崩溃后的恢复
(2)ARIES
四个日志顺序号(LSN):
- RedoLSN:重做阶段的起始点,在分析阶段赋值为脏页表的最小RecLSN,如无脏页表则为检查点日志记录的LSN。
- RecLSN:脏页表中标示未写入磁盘的写操作记录,其值为最后写记录的LSN,在分析阶段可能会增加脏页表的项。
- LastLSN:检查点日志记录的LSN,其值为事务
所写的最后一个日志的LSN,在分析阶段会首先将
加入到undo-list。
- PrevLSN:撤销阶段用于回滚,其值为同一事务的前一日止记录的LSN。
三个阶段:
步骤的具体解释很繁琐,不如直接看例子: