事务是用户自定义的一个数据库操作序列,事务具有ACID特性:
(1)原子性:Atomicity,事务的所有操作在数据库中要么全做要么全不做。
(2)一致性:Consistency,事务的执行使数据库从一个一致状态变到另一个一致状态。
(3)隔离性:Isolation,一个事务的执行不能被其他事务干扰。
(4)持续性:Durability,一个事务一旦提交,它对数据库的改变必须是永久的,即便系统出现故障时也是如此。
并发控制
(1)丢失更新(丢失修改):两个事务T1和T2读入同一个数据并修改,T2提交的结果破坏了T1提交的结果,T1的修改被丢失。
(2)读过时的数据:事务T1读取某一数据,事务T2读取并修改了同一数据,T1为了对读取值进行校对再读此数据,得到不同的结果 。
(3)读脏数据:事务T1修改某一数据,事务T2读取同一数据,而T1由于某种原因被撤销,则T2读取的数据就为脏数据,即不正确的数据。
处理并发控制的主要方法就是采用封锁技术,主要有两种类型的锁:
(1)排他型封锁(X封锁):如果事务T对数据A实现了X封锁,那么只允许事务T读取和修改数据A,其他事务要等事务T解锁X封锁以后,才能对数据A实现任何类型的封锁。
(2)共享型封锁(S封锁):如果事务T对数据A实现了S封锁,那么允许事务T读取数据A,但不能修改数据A,在所有S封锁解除这前决不允许任何事务对数据A实现X封锁。
封锁协议
(1)一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。一级封锁协议可以防止丢失更新,并保证事务T是可恢复的。但不能保证读过时数据和读脏数据。由于在一级锁协议中,仅仅是读数据不对其进行修改,是不需要加锁的,所以不能保证可重复读和不读脏数据。
(2)二级封锁协议:一级封锁协议加上事务T在读数据R之前先对其加S锁,读完后即可释放S锁,二级锁协议可防止丢失更新,还可防止读脏数据。但不能保证读时数据。
(3)三级封锁协议:一级封锁协议加上事务T在读取数据R之前先对其加S锁,直到事务结束才释放。三级封锁可防止丢失更新、防止读脏数据与读过时数据。
(4)两段锁协议:所有事务必须分两个阶段对数据项加锁和解锁。
- 扩展阶段:在对任何数据项的读、写之前,首先要申请并获得对该数据的封锁。
- 收缩阶段:是释放一个封锁之后,事务不能现申请和获得任何其他封锁。
可以证时,若并发执行的所有事务均遵守两段协议,则这些并行事务的任何并行调度策略都是可串行化的。
死锁
(1)预防法。如顺序申请法、一次申请法等。
(2)死锁解除法。这种方法需要两个程序,一个是死锁检测程序,另一个是解锁程序。
备份与恢复技术
总结保种故障,对数据库的影响有两种可能性,一是数据库本身被破坏,二是数据库没有被破坏,但数据可能不正确,这是因为事务的运行被终止所造成的。
(1)数据备份:静态备份和动态备份,海量备份和增量备份。
(2)日志文件:写一个修改到数据库和写一个表示这个修改的日志记录到日志文件中是两个不同的操作,有可能在这两个操作之间发生故障,如果先写了数据库修改,而在日志记录中没有登记这个修改,则以后就无法恢复这个修改了。因为,为了安全,应该先写日志文件,即首先把修改记录写到日志文件上,然后再写数据训的修改,这就是“先写日志文件”的原则。
(3)数据恢复:
- 事务故障的恢复:由系统自动完成,反向扫描日志文件,查找该事务的更新操作,对该事务的更新操作执行逆操作,继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理,如此处理下去,直至读致此事务的开始标记,事务故障恢复完成。
- 系统故障恢复:在系统重新启动时自动完成,不需要用户干预。正向扫描日志文件,找出在故障发生前已提交的事务,将其事务标识记入重做Redo队列。同时找出故障发生时尚未完成的事务,将其事务标识记入撤销(Undo)队列。对于撤销队列中的各个事务进行撤销处理,反向扫描日志文件,对每个Undo事务的更新操作执行逆操作。对于重做队列中的各个事务进行重做处理。正向扫描日志文件,对每个Redo事务重新执行日志文件登记的操作。
- 介质故障和病毒破坏恢复:将入最新的数据库备份,从故障点开始反向扫描日志文件,找出已提交事务标识并记入redo队列,从起始点开始正向扫描日志文件,根据Redo队列中的记录,重做已完成的任务。
数据库的安全性
依赖于两种方式,一种是DBMS本身提供的用户识别、视图、使用权限控制和审计等管理措施,另一种就是靠数据库的应用程序来实现对数据库访问进行控制和管理 。
DBMS对于用户的访问存取控制有以下两个基本的原则:
(1)隔离原则:用户只能存取他自己所有的和已经取得制授权的数据对象。
(2)控制原则:用户只能按他所取得的数据存取方式存取数据,不能越权。
数据库的完整性
数据库的完整性可分为
(1)实体完整性:要求主码中的任一属性不能为空。
(2)参照完整性:若基本关系R中含有与另一基本关系S的主码PK相对应的属性组FK,对R中的每个元组在FK上的值必须是S中某个元组的PK值。
- 外码能否接受空值问题,需要根据实际决定。
- 在被参照关系中删除元组的问题:有三种处理方式(a)级联删除(b)受限删除(c)置空删除
- 在参照关系中插入元组的问题:(a)受限插入(b)递归插入
(3)用户定义的完整性:
(4)触发器:一个事件的发生必然触发另外一些事件的发生。
数据库优化
(1)SQL的性能优化。建议每一个DBA都应该收集和整理一份SQL编码规范,并在真实数据库上对这些SQL语句进行性测试和跟踪并不断调整。需要强调的是,随着数据量的变化和数据库版本升级后,往往会导致部分SQL性能下降,所以SQL跟踪优化是DBA的一项质疑不断的工作。
(2)数据库的性能化。调整参数。
最后欢迎大家访问我的个人网站:1024s