数据库恢复和并发控制

故障恢复模块 并发模块(事务会冲突)

事务的性质(ACID):

1.原子性(Atomicity)、2.一致性(Consistency)、3.隔离性(Isolation)、4.持续性(Durability)

原子性:

事务中的诸多操作要么全做(1)要么都不做(0)。

一致性:

事务的执行结果必须是使数据库从一个一致性状态到另一个一致性状态。

隔离性:

一个事务的执行不能被其他事务干扰。(内部操作隔离)

持续性(永久性):

是指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
破坏ACID的因素一般2个:1.事务执行过程中中断,2.多个事务交叉运行

故障的种类:

1.事务故障,事务运行过程中被中断,需要回滚Rollback,这类恢复操作被称为事务撤销(UNDO)。

2.系统故障,系统出现故障,恢复子系统要强行撤销(UNDO)所有未完成事务,并且重做(REDO)所有已提交的事务,将缓冲区中已完成事务提交的结果写入数据库。

3.介质故障,概率很小但破坏性很大,常见是磁盘损坏、磁头碰撞、瞬时强磁场干扰、操作系统错误。

4.计算机病毒和人为破坏。

恢复的实现技术

1.数据转储。
静态转储要在没有事务运行时进行。比较简单,但是进行时不能操作数据库,降低了数据库的可用性。动态转储不能保证副本正确性,需要结合后备副本+日志文件。

2.登记日志文件

故障恢复策略

……

并发操作带来的问题

1.丢失修改(Lost Update) 写-写冲突
    事务T1对数据修改时,事务T2对数据修改导致对T1的修改被覆盖。

2.不可重复读(Unrepeatable Read) 读-写冲突
    事务T1读取数据后,T2对数据进行修改、删除、增加的操作导致事务T1再次读取数据与第一次读取数据不相符。

3.读"脏数据"(Dirty Read) 读-写冲突
    事务T1对数据修改后,T2使用这个数据,但是之后T1对事务进行了回滚。

读-读不会造成冲突

封锁

封锁就是事务T对某个数据对象进行操作之前先向系统申请对其加锁。

排它锁(Exclusive Lock,X锁)
    又称为写锁、独占锁。只允许事务T读取、修改A,其他事务不能再对A加锁,直到T释放A上的锁。保证了其他事务再T释放A上的锁之前不能再对A进行读取和修改。
共享锁(Share Lock,S锁)
    又称为读锁。加锁后事务T可以读A但不能修改A,其他事务只能再对A加S锁,不能加X锁。直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何操作。
用封锁机制可以解决上述三种数据不一致问题。

活锁

若T1封了A,T2也要封,T3也要封,T4也要封……,T1解锁后跳过了T2,让T3及T4封锁A,导致T2一直无法封锁。
    解决方法是采取"先来先服务"的策略。排队,数据对象上的锁一旦释放,首先批准申请队列中第一个事务获得锁。

死锁

T1封锁了A1 T2封锁了A2,现在T1要封锁A2,T2要封锁A1,但是A1,A2都没被解锁,导致T1和T2互相等待,两个事务永远不能结束,形成死锁。
    预防死锁,有2种方法:一次封锁法和顺序封锁法。
        一次封锁法要求所有数据一次全部加锁,防止死锁,但降低并发度。一次封锁法扩大了封锁范围。
        顺序封锁法对数据对象规定封锁顺序,维护成本高。
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2015-2024 buynonsense
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信