1.事务(Transaction)
对数据库的操作以事务作为基本单元,以便保证数据库的一致性。比如转帐。
事务A要进行转账,那么转出的账号就要扣钱,转入的账号就要加钱,这两个操作必须同时执行成功,以保持数据的一致性。
事务在sql中指一组sql语句组成的数据库逻辑处理单元,这组sql操作要么全部成功,要么全部不成功。
定义:
事务是构成单一逻辑工作单元的操作集合。
事务的标定 :
在操作时, “事务”以BEGIN TRANSACTION语句开始,以COMMIT或ROLLBACK语句结束。
COMMIT或ROLLBACK语句的意义
COMMIT (提交)表示事务正常结束,结束后系统将进入一个正常状态,可以实施事务对数据的更新(写回磁盘);
ROLLBACK表示事务不能正常结束,应该回退到该事务执行之前的状态,即撤消该事务对数据库的所有更新操作,否则数据库将进入一个不正常状态。
2.事务的特性(ACID)
为保证数据库中的数据总是正确的,要求事务具有如下四个性质:
1.原子性(Atomic)
事务中若干个数据库操作构成的操作序列,要么全做,要么全不做,是不可分割的工作单位。
在系统运行时,由DBMS的事务管理子系统实施。
2.一致性(Consistency)
一个事务执行的结果,应保证数据库的一致性,即数据库不会因为事务的操作而出现不一致性的状态。
数据的不一致性指数据的矛盾性:数据冗余(调价----库中价与标价不一致)、并发操作、系统故障等造成。
由DBMS的完整性子系统来检测、实施一致性。
3.隔离性(Isolation)
在多个事务并发执行时,要保证每个事务执行的结果是正确的-----与它们的某一串行结果相同。
由并发控制子系统实施。
4.持久性(Durability)
一事务一旦完成全部操作,它对数据库的所有更新应永久反映在数据库中,即便系统发生故障。
由恢复子系统完成。
原子性、一致性和持久性依靠恢复子系统保证。
隔离性由数据库锁机制实现。
3.数据库的恢复
数据库系统运行时可能出现各种故障,它们都可能导致数据的丢失。
DBMS的恢复子系统采取一系列的措施,保证在任何情况下保持事务的原子性和一致性,以确保数据不丢失、不破坏。
可恢复性定义:
DBMS把数据库从被破坏、不正确的状态恢复到最近一个正确状态的能力 称为数据库的可恢复性。
存储器类型
1.易失性存储器(volatile storage)
内存和cache存储器
2.非易失性存储器(nonvolatile storage)
磁盘和磁带
3.稳定存储器(stable storage)
理论上的概念,存储在稳定存储器上的数据决不会丢失。通过对非易失性存储器进行技术处理来实现稳定存储器的效果。
稳定存储器的实现技术
1.备份
硬件上采用磁盘镜像(自动存储在另一磁盘上)、磁盘阵列RAID、双机容错;软件上采用数据拷贝。
2.数据银行(data bank)
利用计算机网络将数据传输到远地的计算机存储系统。
使数据库具有可恢复性的基本原则——冗余Redundancy(重复存储)
恢复的基本原则和方法
1)平时做好两件事情
转储
周期性地将数据库转储到另一磁盘或磁带上。
建立日志数据库
将事务的开始结束标志、事务对数据库的每次增删改前后的值记录到“日志”,以便有案可查;
2)一旦发生数据库故障,分两种情形处理
数据库破坏
用备份恢复,利用日志库“重做”(REDO)处理。
数据库未破坏,但某些数据不可靠、被怀疑(如程序异常中断)
利用日志库执行“撤消”(UNDO)处理。
事务隔离级别(4级)
第一种隔离级别:Read uncommitted(读未提交)
如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据,该隔离级别可以通过“排他写锁”,但是不排斥读线程实现。这样就避免了更新丢失,却可能出现脏读,也就是说事务B读取到了事务A未提交的数据。基本没有隔离,但性能是最好的。
解决了更新丢失,但还是可能会出现脏读
第二种隔离级别:Read committed(读提交) Oracle 默认这一种
如果是一个读事务(线程),则允许其他事务读写,如果是写事务将会禁止其他事务访问该行数据,该隔离级别避免了脏读,但是可能出现不可重复读。事务A事先读取了数据,事务B紧接着更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。
解决了更新丢失和脏读问题
Oracle 默认使用的事务隔离级别。事务内执行的查询只能看到查询执行前(而非事务开始前)就已经提交的数据。Oracle 的查询永远不会读取脏数据(未提交的数据)。
第三种隔离级别:Repeatable read(可重复读取) MySQL默认这一种
可重复读取是指在一个事务内,多次读同一个数据,在这个事务还没结束时,其他事务不能访问该数据(包括了读写),这样就可以在同一个事务内两次读到的数据是一样的,因此称为是可重复读隔离级别,读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务(包括了读写),这样避免了不可重复读和脏读,但是有时可能会出现幻读。(读取数据的事务)可以通过“共享读镜”和“排他写锁”实现。
解决了更新丢失、脏读、不可重复读、但是还会出现幻读
第四种隔离级别:Serializable(可序化) 基本不用
读的时候加共享锁、写的时候加排他锁,提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行,如果仅仅通过“行级锁”是无法实现序列化的,必须通过其他机制保证新插入的数据不会被执行查询操作的事务访问到。序列化是最高的事务隔离级别,同时代价也是最高的,性能很低,一般很少使用,没有什么并发性可言。在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读。
解决了更新丢失、脏读、不可重复读、幻读(虚读)
4.故障类型和恢复方法
数据库的故障
数据库的故障表现为事务的故障——即事务执行的失败。
常见的DBS故障
1.事务故障
2.系统故障
3.介质故障
针对不同类型的故障,采取不同的恢复策略。
1 .事务故障
事务执行失败。
两种情况:
(1)可以预期的(如转帐余额不够,程序中判别并回滚,系统做undo)
(2)不可预期的(如运算溢出、并发事务死锁故障、违反了某些完整性限制而导致的故障等。由系统直接对该事务做undo)
2.系统故障(软故障—Soft Crash )
系统故障是指由于硬件故障、数据库软件及操作系统的漏洞、突然停电灯情况,系统因故停止运转,致使所有正在运行的事务都以非正常方式终止。
待计算机重新启动之后,
对于未完成的事务可能写入数据库的内容,回滚所有未完成的事务写的结果;(UNDO)
对于已完成的事务可能部分或全部留在缓冲区的结果,需要重做所有已提交的事务(即撤销所有未提交的事务,重做所有已提交的事务)。(REDO)
重新启动时分情况处理:
对未完成的事务强行撤消(UNDO)。
对己提交但更新结果还保留在缓冲区中的事务要进行重做(REDO)。
3.介质故障(硬故障—Hard Crash)
介质故障或病毒破坏,使磁盘上的物理数据遭到毁灭性破坏。
介质故障也称为硬故障,主要指数据库在运行过程中,由于磁头碰撞、磁盘损坏、强磁干扰、天灾人祸等情况,使得数据库中的数据部分或全部丢失的一类故障。
恢复方法如下:
(1)装入最新的数据库副本,使数据库恢复到最近一次转储时的可用状态;
(2)在日志文件中查找转储以后所有已经提交的事务;
(3)对这些提交的事务进行REDO处理,恢复到故障前某一时刻的一致状态。
介质故障的软件容错:使用数据库备份及事务日志文件,通过恢复技术,恢复数据库到备份结束时的状态。
介质故障的硬件容错:采用双物理存储设备,使两个硬盘存储内容相同,当其中一个硬盘出现故障时,及时使用另一个备份硬盘。
5.数据库的并发控制
在多用户共享系统中,多事务同时对一数据进行操作,叫并发操作。并发操作可能破坏数据库的完整性。
DBMS有并发控制子系统,来负责协同多事务,保证数据库的完整性,同时保证多用户得到正确数据。
数据库的并发操作会带来三个问题:
1.丢失更新问题;
2.依赖未提交更新问题;
3.不一致分析问题
产生以上三种现象的原因是并发操作破坏了事务的隔离性。为了应对这些数据不一致性,主要技术主要有:封锁(Locking)技术,时间戳(Timestamping)技术,乐观控制法。
1.封锁技术
封锁类型(Locking Type)
基本的封锁类型:排它锁和共享锁。
1.排它锁(Exclusive Lock),又称写锁,,简称为X锁。
当事务T对某个数据对象R实现X封锁后,其他事务要等T解除X封锁以后,才能对R进行封锁。
2.共享锁(Share Lock)
共享锁又称读锁,简称为S锁
当事务T对某个数据对象R实现S封锁后,其他事务只能对R加S锁,而不能加X锁,直到T释放R上的S锁。
其它事务,只能读取R,而不能再对R作任何修改.
封锁的相容矩阵
封锁粒度
封锁对象的大小称为封锁粒度,封锁粒度指封锁的单位。
根据对数据的不同处理,封锁的对象可以是这样一些逻辑单元:字段、记录、表、数据库等。
封锁粒度与系统的并发度和并发控制的开销密切相关。
在实际应用中,应同时考虑封锁机构和并发度两个因素,对系统开销与并发度进行权衡,以求得最优的效果。
封锁协议
1.一级封锁协议(PXC封锁协议)
一级封锁协议是指,事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放,若未获得必须等待。
一级封锁协议可以防止丢失修改,并保证事务T是可恢复的。
上述封锁协议只有当修改数据时才进行加锁,如果只是读取数据并不加锁,所以它不能防止“污读”和“重读”数据。
2.二级封锁协议 (PS协议)
二级封锁协议是指,在一级封锁协议基础上增加事务T在读数据R之前必须先对其加S锁,读完后即可释放S锁。
二级封锁协议出防止了丢失修改,还可以进一步防止读“脏”数据。
3.三级封锁协议 (PSC协议)
三级封锁协议是指,在一级封锁协议的基础上增加事务T在读数据R之前必须先对其加S锁,直到事务结束才释放。
三级封锁协议出防止了丢失修改和读“脏”数据外,还可以进一步防止了不可重复读。
封锁带来的问题
封锁技术可有效解决并行操作的一致性问题,但也可产生新的问题,即活锁、饿锁和死锁问题。
1.活锁
如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求,…,T2有可能永远等待,这就是活锁的情形。
避免活锁的简单方法是采用先来先服务的策略。
2.死锁
如果事务T1封锁了数据R1,T2封锁了数据R2,然后T1又请求封锁R2,因T2已封锁了R2,于是T1等待T2释放R2上的锁。接着T2又申请封锁R1,因T1已封锁了R1,T2也只能等待T1释放R1上的锁。这样就出现了T1在等待T2,而T2又在等待T1的局面,T1和T2两个事务永远不能结束,形成死锁。
3.饿锁
一事务序列,每个都对数据项申请加S锁,每个授权加锁一小段时间后释放锁,时间交叠连起来;此时另一事务申请对该数据加X锁,无法获得,叫饿锁。
6.并发操作的调度
调度:事务执行次序称为调度。
多个事务执行中有几种不同方法
(1)串行执行——串行调度
(2)并发执行——并发调度
(3)并发执行的可串行化
多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行它们时的结果相同,我们称这种调度策略为可串行化(Serializable)的调度。
可串行性(Serializability)是并发事务正确性的准则。按这个准则规定,一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度。
比如,两个事务的并发调度的某一执行方式,与先执行T1后执行T2(或先执行T2后执行T1)的结果是一样的,称这一调度符合可串行化调度。
两阶段封锁协议的内容:
(1)任何事务在读写数据之前必须获得对该数据的相应加锁—扩展阶段
(2)一事务释放一个锁后,不可再对其它数据加锁—收缩阶段
即事务的执行分为两个阶段:
第一阶段是获得封锁的阶段,称为扩展阶段。
第二阶段是释放封锁的阶段,称为收缩阶段。
两阶段封锁协议与可串行化之间的关系:
两阶段封锁协议是可串行化的充分条件。
两阶段封锁协议与死锁的关系:
两阶段封锁协议仍可能导致死锁发生,甚至增加,因为每个事务不能及时解除它封锁的数据。
7.数据库的完整性
数据库完整性的含义
数据库的完整性是指保护数据库中数据的正确性、有效性和相容性,防止错误的数据进入数据库。
数据的正确性指数据的合法性,如格式、数字中不能含字符等。
数数据的有效性指数据是否属于数据定义的范围。
数据的相容性指表示同一事物的数据应相同,不一致即不相容。
完整性子系统
定义
DBMS中执行完整性检查的子系统称为“完整性子系统”。
完整性子系统的主要功能
监督事务的执行,并测试是否违反了完整性规则—数据应满足的约束条件。
若有违反现象,则采用适当的操作,如拒绝操作、报告违规情况、改正错误等。
完整性子系统根据“完整性规则集”工作
完整性规则集是由DBA向DBMS提出的一组关于数据的语义约束。这些语义约束是DBMS控制数据完整性的依据。
每条规则由三部分组成
1.触发条件:规定何时使用规则检查数据;
2.约束条件:要检查什么样的错误;
3.违约响应:规定违约时要做的动作。
关系模型的完整性包括实体完整性,参照完整性和用户定义完整性。
用户定义的完整性包括
属性上的完整性约束
列值非空
列值唯一
检测列值是否满足一个布尔表达式(CHECK短语)
元组上的完整性约束:只能是CHECK短语形式
考虑实验中进行的完整性定义和违规现象。
SQL中的触发器
动作时间
AFTER、BEFORE
动作尺寸
For each row—对每个元组的修改都检查一次
For each statement—对SQL语句的执行结果执行一次
8.数据库的安全性
数据库安全性的定义
数据库的安全性指保护数据库,防止非法使用,以免数据的泄密、更改或破坏。
安全性级别
可从五个级别上设置各种安全措施
1.环境级:对计算机机房和设备加以保护;
2.职员级:工作人员要正确授予用户访问DB的权限;
3.OS级:防止未授权的人从OS级访问DB;
4.网络级:网络内部软件内部的安全性;
5.DBS级:检测用户身份的合法性和使用数据库的权限的正确性。
权限
**用户(或应用程序)使用数据库的方式称为“权限”。**权限的种类有
1.读:允许用户读数据
2.插入
3.修改
4.删除
可同时授予一用户多个权限或0个权限
视图
视图机制使系统具有三个优点:
1.数据安全性
2.逻辑数据独立性
3.操作简洁性
六类权限
SELECT
INSERT
DELETE
UPDATE
REFERENCES:允许用户创建新的关系时,引用其它关系主键作为外键
USAGE:允许用户使用已经定义的域
授予权限
GRANT <权限表> ON <数据库元素> TO <用户名表>[WITH GRANT OPTION]
权限表:六种中的一些或全部(ALL PRIVILEGES)
数据库元素:关系、视图或域
回收语句
REVOKE <权限表> ON <数据库元素> FROM <用户名表>[RESTRICT|CASCADE]