1.31k likes | 1.48k Views
第 7 章 系统实现技术. 7.1 事务. 7.2 数据库的并发控制. 7.3 DB 的恢复. 7.4 数据库的安全性. 7.5 数据库的完整性. 7.1.1 事务的基本概念. 定义: 事务是形成一个逻辑工作单位的数据库的操作的汇集。 或: 是由用户定义的一个 DB 的操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。 事务和程序是两个概念,一般的,一个程序可包含多个事务。 程序 事务. 7.1. 事务.
E N D
第7章 系统实现技术 7.1 事务 7.2 数据库的并发控制 7.3 DB的恢复 7.4数据库的安全性 7.5数据库的完整性
7.1.1 事务的基本概念 定义: 事务是形成一个逻辑工作单位的数据库的操作的汇集。 或: 是由用户定义的一个DB的操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。 事务和程序是两个概念,一般的,一个程序可包含多个事务。 程序 事务 7.1 事务
事务以begin transaction 开始 显示定义 commit 提交 事务以end Transaction结束 事务的定义 roll back回退 7.1.1 事务的基本概念 默认按缺省自动划分(隐式) 默认(隐式)有:ALTER TABLE 、CREATE 、DELETE、 DROP、 FETCH、 INSERT 、OPEN 、SELECT、 UPDATE等
例:定义一个未提交的事务。 BEGIN TRANSACTION T1 GO UPDATE S SET SDEPT='计算机‘ WHERE SDEPT='aa' GO BEGIN TRANSACTION T1 GO UPDATE S SET SDEPT='计算机‘ WHERE SDEPT='aa' ROLLBACK TRAN GO 7.1.1 事务的基本概念
例:定义一个提交的事务。 BEGIN TRANSACTION T1 GO UPDATE S SET SDEPT='计算机'WHERE SDEPT='aa' COMMIT TRAN GO --注意:打开S表看结果 BEGIN TRANSACTION T1 GO UPDATE S SET SDEPT='计算机'WHERE SDEPT='aa' ROLLBACK TRAN GO --注意:同样打开S表看结果 7.1.1 事务的基本概念
7.1.2 事务的ACID性质 为了保证DB的完整(正确),事务应具有以下四个性质 1. 原子性(atomicity) 一个事务是不分割的操作序列,要么全做,要么全不做. 2. 一致性(consistency) 事务的执行必须从一个使DB一致的状态到另一个是使DB一致的状态。既:DB不会因事务的执行而遭受破坏。 7.1 事务 如:一公司在银行有两个帐号。从A帐号—>B帐号转10000元,既可定义一个事务。 A-10000 B+10000
3. 隔离性(isolation) 一个事务的执行不能被其他事务打扰,在并发事务操作时,系统应保证与这些事务独执行时结果一样。 4. 持久性(durability) 一个事务一旦完成全部操作后,它对DB的所有更新应永久反映在DB中。即使以后系统发现故障,也应保留这个事务的结果。 7.1.2 事务的ACID性质 上述四个性质分别有DBMS相应的子系统实现。 A: 由 DBMS的事务管理子系统实现。 C: 由DBMS测试完整性约束自动完成。 I: 由DBMS的并发控制子系统实现 D: 由DBMS恢复控制子系统实现。
对DB的访问是建立在读,写两个操作的基础上的对DB的访问是建立在读,写两个操作的基础上的 . read(x): 把数据X从DB读到内存缓冲区 . write(x): 把数据X从内存缓冲区写回DB (在实际操作时,write(x)未必就写回DB很可能先暂存在系统缓冲区,然后再写回硬盘。先假定write(x)写回磁盘。) 举例说明事务的ACID性质: 7.1.2 例:银行DB有转帐事务T1,从帐号A转50元到帐号B 事务的ACID性质 T1: read(A) A:=A-50 Write(A) Read(B) B:=B+50 Write(B)
(1) 原子性: 由事务的原子性保持事务的一致性,但事务的执行有一定的时间,在某一个时刻会不一致,是正常的 (2) 一致性: A-50,B+50 A+B的和不变 7.1.2 (3) 隔离性: 事务的ACID性质 在A-50后,突然插入一个事务来计算A+B,那肯定会不对,这就要由DBMS的并发控制来控制。 (4) 持久性: 事务正确执行后,仍长期保存,不能丢失
7.1.3 事务的状态变迁 read/write commit begin end 提 交 活动 局部提交 transaction transaction abort 7.1 失败 异常终止 事务 roll back
read/write commit begin end 提 交 局部提交 活动 transaction transaction abort 失败 异常中止 7.1.3 roll back 事务的状态变迁 1、活动状态: 事务开始执行,即进入“活动”状态,在活动状态执行对DB进行读/写,但“写”并不立即写到硬盘,可暂存在系统缓冲区。
read/write commit begin end 提 交 局部提交 活动 transaction transaction abort 失败 异常中止 7.1.3 roll back 事务的状态变迁 2、局部提交 事务执行完后,进入该状态,但对DB的修改很可能在缓冲区内,所以事务并未真正结束。
read/write commit begin end 提 交 局部提交 活动 transaction transaction abort 失败 异常中止 7.1.3 roll back 事务的状态变迁 3、失败 没有运行到事务的最后一个语句就中止 两种 事务的修改未写到硬盘
read/write commit begin end 提 交 局部提交 活动 transaction transaction abort 失败 异常中止 4、异常中止 roll back 7.1.3 在“失败”状态的事务,很可能对硬盘的数据进行了一部分修改,为了保证事务的原子性,应撤消,执行rollback回退到事务执行前的状态,由恢复子系统完成。 事务的状态变迁 重新启动事务: 由硬件等原因造成 在异常中止时: 取消事务: 由事务内逻辑错误
read/write commit begin end 提 交 局部提交 活动 transaction transaction abort 失败 异常中止 7.1.3 roll back 5、提交 事务的状态变迁 在局部提交后,并发控制系统将检查该事务与并发事务是否发生干扰,通过检查后,系统执行commit。 把对DB的修改的全部写到硬盘,成功结束。 commit 事务结束有两个状态 roll back
7.1.4事务的并发执行 为了提高事务的执行效率,使多个事务并发执行。 定义: 事务的执行次序称为“调度”。 如果多个事务依次执行,则称为事务的串行调度。 如果利用分时的方法同时处理多个事务,则称为事务的并发调度。 7.1 举例说明事务的并发执行,可能会带来DB的不一致性。 事务
例7-1: 设事务T1从帐号A转100元到帐号B T2从帐号A转10%的款到帐号B T2: T1: Read(A) Read(A) A:=A-100 Temp:=A*0.1 Write(A) A:=A-temp 7.1.4 Write(A) Read(B) 事务的并发执行 B:=B+100 Read(B) Write(B) B:=B+temp Write(B) 设A.B的初值为2000,1000
第一种S1:串行:T1、T2 设A.B的初值为2000,1000 7.1.4 事务的并发执行 A=1710 B=1290
设A.B的初值为2000,1000 7.1.4 事务的并发执行 A=1700B=1300
第三种S3:并发调度 设A.B的初值为2000,1000 7.1.4 事务的并发执行 A=1710 B=1290
设A.B的初值为2000,1000 第四种S4:并发调度 7.1.4 事务的并发执行 A=1900 B=1200
如果有n个事务,串行调度有n!种不同的有效调度(都正确)并行调度有远远>n!种调度,且有的并发调度是正确的(和串行调度之一相等即可)。如果有n个事务,串行调度有n!种不同的有效调度(都正确)并行调度有远远>n!种调度,且有的并发调度是正确的(和串行调度之一相等即可)。 如何产生一个正确的并发调度,由DB的并发控制系统实现。 7.1.4 事务的并发执行
7.1.5并发事务的可串行化 从上例可以看出,有的并发调度可以保持DB的一致,有的则不行,涉及到一个概念——并发事务的可串行化。 冲突可串行化 两种不同形式的等价调度: 观察可串行化 (了解) 1. 冲突可串行化 7.1 事务 设有两个事务Ti、Tj,其调度为S。 S中有两个相邻语句Ii和Ij(指read,write)分别来自Ti、Tj。
第一: 如果Ii和Ij是对不同数据的操作,那么交换Ii和Ij次序,不影响调度执行的结果。 第二: 如果Ii和Ij是对同一数据的操作,则 (1) Ii=r(Q) Ij=r(Q) 可忽视Ii、Ij的先后次序 即可互换 7.1.5 并发事务的可串行化 (2) Ii=r(Q) Ij=w(Q) Ii、Ij互换后,Ii读Q可能就 不一样 即:不能互换 (3) Ii=w(Q) Ij=r(Q) 不能互换 (同上) (4) Ii=w(Q) Ij=w(Q) 其次序直接影响DB中 值 即:不能互换
定义: Ii和Ij是并发事务Ti和Tj中的read、write语句,并在并发调度中相邻。 当Ii和Ij是对同一数据操作时,并且至少有一个write语句,我们称Ii、Ij是一对“冲突”语句,否则,为“非冲突”语句。 7.1.5 在调度S中,有一对相邻的语句是“非冲突”的,那么它次序可互换,且交换后产生的新调度S’和S等价,即产生相同的执行结果。 并发事务的可串行化 上例上的第三种情况S3(简化只留下r、w语句)
S3 S3-1 7.1.5 并发事务的可串行化
S3-2 S3-3 7.1.5 并发事务的可串行化
S3-4 7.1.5 并发事务的可串行化 同第一种,所以第三种S3和第一种S1是等价的。
定义: 如果调度S’从调度S通过交换一系列的非冲突语句得到,那么称S、S’是一对“冲突等价”的调度。 如果调度S和某个串行调度是“冲突等价”,那么称调度S是“冲突可串行化”的调度。 例7-2:第一种S1和第二种S2是“冲突等价等价”吗? 7.1.5 并发事务的可串行化
例7-2:第一种S1和第二种S2是“冲突等价等价”吗?例7-2:第一种S1和第二种S2是“冲突等价等价”吗? 7.1.5 并发事务的可串行化 即:T2的r(A)不可能换到T1的w(A)之前 ,所以两种情不一样。
例7-3:有一并发调度T3、T4是“冲突可串行化”吗?例7-3:有一并发调度T3、T4是“冲突可串行化”吗? T3 T4 7.1.5 两邻语句不能互换即不能变为 并发事务的可串行化 T4 T3 所以不是“冲突可串行化”
例7-4:有一并发调度 设: A=2000 B=1000 T1: 从帐号A转100到帐号B T5: 从帐号B转10 到帐号A 7.1.5 并发事务的可串行化 A=1910 B=1090 A=1910 B=1090
这两种“调度”等价,但不是“冲突可串行化”这两种“调度”等价,但不是“冲突可串行化” 可见:“冲突等价”的定义比“调度等价”的定义严格。 即:“冲突等价”一定是“调度等价”。 而“调度等价”不一定是“冲突等价”。 7.1.5 并发事务的可串行化
2. 观察可串行化 比“冲突等价”的定义放宽一些。 定义: 定义:在同样事务集上的两个调度设S、S’,如果满足下列三个条件,那么称S、S’是“观察等价”的调度。 7.1.5 并发事务的可串行化
对每个数据项Q,如果事务Ti在调度S中读了Q的初值,那么事务Ti在调度S’也读Q的初值。对每个数据项Q,如果事务Ti在调度S中读了Q的初值,那么事务Ti在调度S’也读Q的初值。 例7-5: S1 7.1.5 并发事务的可串行化
对每个数据Q,如果在调度S中,事务Tj执行read(Q)操作,读了由事务Ti产生的Q值,那么在调度S’中,事务Tj也必须执行read(Q)操作,读由事务Ti产生的Q值。对每个数据Q,如果在调度S中,事务Tj执行read(Q)操作,读了由事务Ti产生的Q值,那么在调度S’中,事务Tj也必须执行read(Q)操作,读由事务Ti产生的Q值。 S2 7.1.5 并发事务的可串行化
对每个数据项Q,如果在调度S中, 最后执行 W(Q)的事务是Ti,那么在S’中最后执行W(Q)也是Ti。 S3 7.1.5 并发事务的可串行化
S3 S1 S2 (1)(2)可以保证在调度中每个事务读到同样的数据值,(1)(2)(3)可以导致DB的状态是一样的。 7.1.5 并发事务的可串行化
S3 S1 S2 在S1中:T1读A的初始,S2中T1不读A的初始。 所以S1,S2不是观察等价。 S1和S3比较。 (1) T1读 A的初始值(S1,S3中) B的初始值(S1,S3中) 7.1.5 (2) S1中,T2读由T1产生的A,B值。 并发事务的可串行化 (3) S1中,最后执行W(A)、W(B)是T2。 S3中,最后执行W(A)、W(B)是T2。 所以S1和S3是“观察等价”。
定义: 如果调度S与某个串引调度是“观察等价”,那么称调度S是“观察可串行化”的调度。 S3为:观察可串行化,也是“冲突可串行化 7.1.5 例7-6: S1 并发事务的可串行化
S1是“观察可串行化” 但S1不是“冲突可串行化”。 7.1.5 并发事务的可串行化 结论: 每个“冲突可串行化”的调度都是“观察可串行化”,但 “观察可串行化”的调度不一都是“冲突可串行化”。
小 结 1、事务以及性质 2、事务的并发执行 7.1 事务
作 业: 1. 什么样的 调度是正确的调度? P 306 8 9 本节结束
7.2 并发操作 7.2.1 DB的并发操作带来的问题 1. 丢失更新的问题。 S1 7.2 数据库的并发控制 事务T1对数据A的更新丢失,被T2覆盖。
2. 不一致分析的问题(读了过时的数据) S2 7.2.1 DB的并发操作带来的问题 T1要验算,A+B的值是否一致。即:D=C?
7.2.1 DB的并发操作带来的问题 T2读的是过时的数据。
3. 依赖于未提交更新的问题。(读“脏”数据) S3 7.2.1 DB的并发操作带来的问题 T2读到了“脏”数据。 这些问题需要用并发控制来完成, 封锁协议技术 时标协议技术 乐观方法
7.2.2 封锁(locking) 封锁是并发控制的一个非常重要的技术。 基本封锁有两种类型: 排它锁(exclusive locks,简称X锁,又称写锁) 共享锁(share locks,简称S锁,又称读锁)。 X锁: 如果事务T对某个数据(数据项、记录 ……DB)实现X封锁,那么其他事务要等T解除X封锁之后,才能对这个数据进行封锁。 7.2 S锁:如果事务Ti对某数据有一个S封锁,那么其他事物Tj也能对这个数据实现S封锁。但不能对其实现X封锁。 数据库的并发控制
7.2.3 封锁协议 运用X和S锁,对数据加锁时,还要约定一些规则 (如:何时申请、持续时间、何时释放 ), 这些规则称为封锁协议。 1. 一级封锁协议 事务T在修改数据R之前必须先对其加X锁。直到事务结束才释放。 7.2 数据库的并发控制 或: 任何企图更新记录R的事务必须先执行:“Lock-X(R)”操作可获取对该记录进行寻址的能力,并对它获取X封锁。 如果未获取X封锁,那么这个事务进入等待状态,一直到获取X锁,事务才继续。
例7-8: 对丢失更新问题的解决 T1: 对A-2 T2: 对 A-1 7.2.3 封锁协议