数据库的事务

(一)四种特性

 

(二)四种调度

(1)串行调度:事务之间是相互独立,串行执行的,有明确的先后顺序。(eg.调度1、2)

         

    

 

(2)可串行化调度:在并发执行中,通过保证所执行的任何调度的效果等价于串行调度。(eg.调度3)

  • 冲突可串行化(与串行调度冲突等价):优先图无环;(eg.调度3)
  • 非冲突可串行化:优先图有环。(eg。调度4)

    

 

(3)可恢复调度:当事务发生故障时能够正常恢复到初始状态的调度,可恢复调度应满足: 对于每对事务T_iT_j,如果T_j读取了之前由T_i所写的数据项,则T_i先于T_j提交。

(4)无级联调度:避免级联回滚(因单个事务故障导致一系列事务回滚)发生的调度。无级联事务应满足:对于每对事务T_iT_j,如果T_j读取了之前由T_i所写的数据项,则T_i必须在T_j这一读操作之前提交。


(三)四种隔离性级别

 

(四)八种协议

(1)两阶段封锁协议(只有两个阶段)

  • 增长阶段:事务可以获得锁,但不能释放锁;
  • 缩减阶段:事务可以释放锁,但不能获得新锁。

两阶段封锁并不保证不会发生死锁和级联回滚。

(2)严格两阶段封锁协议:除了要求封锁是两阶段之外,还要求事务持有的所有排他锁必须在事务提交之后方可释放。

(3)强两阶段封锁协议:要求事务提交前不得释放任和锁。

严格两阶段封锁协议和强两阶段封锁协议避免了级联回滚。

(4)具有锁转换的两阶段封锁协议

  • 升级(upgrade):从共享到排他的转换,只能发生在增长阶段;
  • 降级(downgrade):从排他到共享的转换,只能发生在缩减阶段。

 

(5)树形协议

所有满足树形协议的调度不仅是冲突可串行化的,而且保证不会产生死锁。

但是树形协议不保证可恢复性和无级联回滚,为了保证可恢复性和无级联回滚,可以将协议修改为在事务结束之前不允许释放排他锁。

 

(6)多粒度封锁协议

      

在一个结点显示加锁之前,该结点的全部祖先结点均先加上了意向锁。因此,事务不必搜索整棵树就能判定能否成功给一个结点加锁。

  • 共享型意向锁(IS):如果一个结点加上了IS锁,那么在树的较低层进行显式封锁,但只能加共享锁(S)。(IS可理解为部分读,即该层的更底层存在某一部分可完全读(S)。)
  • 排他型意向锁(IX):如果一个结点加上了IX锁,那么在树的较低层进行显式封锁,可以加排他锁(X)或者共享锁。(IX可理解为部分读或部分读写,即该层的更底层存在某一部分可以完全读(S)或完全读写(X)。)
  • 共享排他型意向锁(SIX):如果一个结点加上了SIX锁,那么以该结点为根的子树显式地加了共享锁,并且在树的更底层显式地加排他锁。(SIX可理解为部分读写,即该层的更底层存在某一部分可以完全读写(X))

 

(7)时间戳排序协议

  • TS(T_j):事务T_j的时间戳。
  • W-timestamp(Q):成功执行write(Q)的所有事务的最大时间戳。
  • R-timestamp(Q):成功执行read(Q)的所有事务的最大时间戳。

时间戳排序协议保证冲突可串行化和无死锁,但并不能保证可恢复和无级联回滚。

 

(8)基于Thomas写协议的时间戳排序协议

协议中有关read操作的规则保持不变,在某些特定的情况下忽略过时的write操作。

 

(五)两种死锁处理

(1)死锁预防

  • 方法一:要么一次全部封锁要么全部封锁。
  • 方法二:使用抢占和事务回滚。

  • 方法三:锁超时。若在此期间内未授予该事务锁,则称该事务超时,此时该事务自己回滚并重启。

(2)死锁预防和恢复

当且仅当等待图包含环时,系统中存在死锁。

  

从死锁中恢复:

  • 方法一:选择牺牲者
  • 方法二:回滚
  • 方法三:饿死

 

(六)六个日志记录

(1)<T_i, X_j, V_1, V_2>:事务T_i对数据项X_j执行了一个写操作,写操作前X_j的值是V_1,写操作后X_j的值是V_2

(2)<T_i, X_j, V_1>:补偿日志记录,其中V_1是在回滚中数据项X_j恢复成的值。

(3)<T_i\;start>:事务T_i开始。

(4)<T_i\;commit>:事务T_i提交。

(5)<T_i\;abort>:事务T_i中止。

(6)<checkpoint\;L>:检查点,其中L是执行检查点时正活跃的事务的列表。

 

(七)两种恢复算法

(1)系统崩溃后的恢复

 

(2)ARIES

四个日志顺序号(LSN):

  • RedoLSN:重做阶段的起始点,在分析阶段赋值为脏页表的最小RecLSN,如无脏页表则为检查点日志记录的LSN。
  • RecLSN:脏页表中标示未写入磁盘的写操作记录,其值为最后写记录的LSN,在分析阶段可能会增加脏页表的项。
  • LastLSN:检查点日志记录的LSN,其值为事务T_{xn}所写的最后一个日志的LSN,在分析阶段会首先将T_{xn}加入到undo-list。
  • PrevLSN:撤销阶段用于回滚,其值为同一事务的前一日止记录的LSN。

三个阶段:

步骤的具体解释很繁琐,不如直接看例子:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值