以某个售票系统为例,假设有存在两个表,售票表Sale统计售票数,剩余表Remain统计剩余的票数。当卖出一张票时,需要同时更新Sale表和Remain表,Sale加1,Remain减1。但是一旦其中一个表的更新出现了故障,而另一个表的操作照常执行,就会发生Sale多卖出一张票,Remain没有减少剩余量,或者没有卖出票,Remain缺少了一张票的情况。
出现故障后,系统重新提供服务时数据库状态与现实世界状态出现了不一致。
为解决上述问题,数据库管理系统引入了事务的概念,它将这些有内在联系的操作当作一个逻辑单元看待,并采取相应策略保证一个逻辑单元内的操作要么都执行成功,要么都不执行。
事务是用户定义的数据操作系列,这些操作作为一个完整的工作单元,一个事务内的所有语句被作为一个整体,要么全部执行,要么全部不执行。
例:某转账活动。
A账户转给B账户n元,该活动包含两个动作,须形成事务:
动作一:A账户 - n
动作二:B账户 + n
事务结束的两种类型:
如果事务非正常结束,会影响到数据库数据的正确性,因为事物具有一致性,事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。
保证事务的ACID特性是事务处理的重要任务。
事务的ACID特性可能遭到破坏的因素有两种:
由于多用户数据库系统的存在,允许多个用户同时使用数据库系统(如:银行数据库系统、选课系统),特点是同一时刻并发运行的事务数可达数百个,但是有可能产生互相干扰的现象。
数据库管理系统允许多个事务并发执行有优点,也有缺点。
数据库是共享资源,通常有多个事务在同时执行,当多个事务并发的存取数据库时就会存在同时读或写统一数据的情况,如果对并发操作不加控制,就会存在数据读取或存取错误,破坏数据库的一致性。 并发控制是衡量DBMS性能的重要指标之一。
事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放锁前,其他事务不能更新此数据对象。
1.排它锁:
1.死锁的预防:
※结论:
预防死锁的方法并不适合数据库的特点。DBMS更倾向于诊断并解除死锁。
2.死锁的诊断与解除:
(1)超时法:
如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。
优点:实现简单。
缺点:实现设置过短会导致误判死锁;时间设置太长会导致死锁发生后不能及时发现。
(2)等待图法:
用事务等待图动态反映所有事务的等待情况。
指所有事务必须分两个阶段对数据加锁和解锁。
封锁粒度与系统并发度和并发控制的开销密切相关。
故障对数据库的影响有两种:
恢复操作的基本原理:冗余。
利用存储在系统其他地方的冗余数据来重建数据库中已被破坏或不正确的那部分数据。
数据库的恢复涉及两个关键问题:
如何建立冗余数据?
如何利用这些冗余数据实施数据库恢复?
备份数据(数据转储)。
备份日志(登记日志文件)。
要考虑两个因素:
通常情况下,数据库可以每周备份一次,事务日志可以每日备份一次。
对于一些重要的联机事务处理数据库,可以每日备份,事务日志则每隔数小时备份一次。
数据转储:转储是指DBA将整个数据库复制到磁带或另一个磁盘上保存起来的过程,备用的数据称为后备副本或后援副本。
使用方法:
备份方法:
1.静态转储:
在系统中无运行事务时进行的转储操作,转储期间不允许对数据库的任何存取、修改活动。得到的副本是符合数据一致性的副本。优点:实现简单。缺点:降低了数据库的可用性。
2.动态转储:
转储操作与用户事务并发进行,允许对数据库进行存取或修改。优点:不会影响事务的允许。缺点:不能保证副本中的数据正确有效。利用动态转储得到的副本进行故障恢复需要把动态转储期间各事务对数据库的修改活动登记下来建立日志文件,后备副本加上日志文件才能把数据库恢复到某一时刻的正确状态。
3.海量转储:
每次转储全部数据库。从恢复角度看,使用海量转储得到的后被副本进行恢复往往更方便。
4.增量转储:
只转储上次转储后更新过的数据。如果数据库很大,事务处理十分频繁,增量转储更实用有效。
1.以记录为单位的日志文件:
2.以数据块为单位的日志文件:
基本原则:
登记的次序严格按并行事务执行的时间次序。
必须先写日志文件,后写数据库。
恢复数据库是指将数据库从错误描述状态恢复到正确的描述状态(最近的正确时刻)的过程。
1. 事务故障的恢复:
事务故障就是事务在运行至正常终止点前被终止。
恢复方法就是利用日志文件撤销此事务已经对数据库进行的修改。事务故障的恢复由系统自动完成,对用户是透明的,不需要用户干预。
2.系统故障的恢复:
系统故障造成数据库不一致,往往是因为 未完成事务 对数据库的更新写入了数据库,或者已提交事务的更新还留在缓冲区没来得及写入数据库。
恢复方法就是撤销故障发生时未完成的事务或重做已完成的事务。
系统故障的恢复由系统在重新启动时自动完成。
3.介质故障的恢复:
重装数据库,然后重做已完成的事务。
介质故障的恢复需要DBA介入。DBA要重装最近转储的数据库副本和有关的各日志文件副本,执行系统提供的恢复命令。
1.具有检查点的恢复技术:
2.数据库镜像: