Download presentation
Presentation is loading. Please wait.
1
第5章 数据库保护 之事务
2
数据库的安全性 安全性的含义: 安全性控制的方法: 数据库的安全性是指保护数据库,防止因用户非法适用数据库造成数据泄露、更改或破坏。
用户标识和鉴定 存取控制 定义视图 审计 数据加密
3
数据库的完整性 完整性的含义: 完整性约束条件分为6类- 图5-3
数据库的完整性是指保护数据库中数据的正确性、有效性(相容性)和一致性,防止错误的数据进入数据库造成无效操作。 完整性约束条件分为6类- 图5-3 对象粒度:列级、元组级、关系级 状态: 动态:反映数据库状态变迁的约束 静态:反映数据库状态合理性的约束
4
数据库的完整性 静态列级约束 静态元组约束 静态关系约束 对数据类型、格式、取值范围、空值以及其他约束 例如发货量 <= 订货量
实体完整性 参照完整性 函数依赖约束 统计约束
5
数据库的完整性 动态列级约束 修改定义、修改值 动态元组约束 动态关系约束 表5-5
6
数据库的完整性 完整性控制 立即执行的约束/延迟执行的约束 RDBMS在实现参照完整性时需要考虑的几个方面: 定义、检查、维护完整性约束条件
外码是否可空 删除被参照关系元组时的考虑 级联、受限、置空值删除 修改被参照关系中主码的考虑 级联、受限、置空值修改
7
Oracle的完整性控制 实体完整性 参照完整性 用户自定义完整性 要求主属性非空(primary key) 外码(foreign key)
On delete cascade关键字:删除被参照元组时,同事删除参照该元组的那些元组。 用户自定义完整性 Not null Unique check
8
并发控制的含义 并发控制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰,从而避免造成数据的不一致性。
DBMS的并发控制以事务为单位。通常采用封锁技术。
9
提纲 事务概念 事务模型 事务调度 事务隔离性级别 事务冲突可串行化 事务视图可串行化
10
事务概念 事务定义 事务是由一系列操作序列构成的程序执行单元,这些操作要么都做,要么都不做,是一个不可分割的工作单位 例如银行转帐
SQL中事务的定义 事务以Begin transaction开始,以Commit work或 Rollback work结束 Commit work表示提交,事务正常结束 Rollback work表示事务非正常结束,撤消事务已做的操作,回滚到事务开始时状态
11
事务概念 示例 银行转帐:事务T从A帐户过户50¥到B帐户 T: read(A); A := A – 50; write(A);
read(B); B := B + 50; write(B); read(X):从数据库传送数据项X到事务的工作区中 write(X):从事务的工作区中将数据项X写回数据库
12
事务概念 事务特性(ACID) 原子性(Atomicity) 事务中包含的所有操作要么全做,要么全不做 原子性由恢复机制实现
一致性(Consistency) 事务的隔离执行必须保证数据库的一致性 事务开始前,数据库处于一致性的状态;事务结束后,数据库必须仍处于一致性状态 数据库的一致性状态由用户来负责 如银行转帐,转帐前后两个帐户金额之和应保持不变(意大利香肠)
13
事务概念 隔离性(Isolation) 系统必须保证事务不受其它并发执行事务的影响
对任何一对事务T1,T2,在T1看来,T2要么在T1开始之前已经结束,要么在T1完成之后再开始执行 隔离性通过并发控制机制实现 持久性(Durability) 一个事务一旦提交之后,它对数据库的影响必须是永久的 系统发生故障不能改变事务的持久性 持久性通过恢复机制实现
14
事务概念 事务生命周期图 活动状态 失败状态 部分 提交状态 中止状态 初始状态 事务无法继 续正常执行 事务回滚,数据库恢
复到事务开始前状态 最后一条语 句被执行后 成功完成,永 久写入数据库 事务生命周期图
15
update SC set GRADE = GRADE+15
事务概念 事务执行模式 显式事务 以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束 隐含事务 事务自动开始,直到遇到COMMIT或ROLLBACK时结束 自动事务 每个数据操作语句作为一个事务 update SC set GRADE = GRADE+15
16
事务模型 平面事务 平面事务的缺点(不能部分回滚) 一层结构BEGIN TRAN……COMMIT 确定旅行路线 批量更新
如银行结算利息,可以把更新每个帐号作为一个事务,也可以把更新所有帐号作为一个事务 北京 郑州 上海 天津 济南
17
事务模型 保存点 begin_transaction() S1; sp1 := create_savepoint(); … Sn;
spn := create_savepoint(); if(condition){ rollback(spi); } commit();
18
事务模型 嵌套事务 事务中包含事务 北京 上海 北京 天津 天津 上海 天津 济南 济南 上海 天津 上海 天津 郑州 郑州 上海 T1
19
事务模型 分布式事务 tx_begin(); … execute T1 DBMS execute T2 execute T3
tx_commit(); DBMS Site B Site C Site D Site A
20
事务模型 工作流 工作流是一个,它涉及由不同的处理实体所执行的多个任务的相互协同的执行
21
事务模型 Take Order Update Remove Package Arrange Shipping By Air Land
Complete Bill AND OR
22
事务调度 事务的执行顺序称为一个调度,表示事务的指令在系统中执行的时间顺序 一组事务的调度必须保证 串行调度 并行调度
包含了所有事务的操作指令 一个事务中指令的顺序必须保持不变 串行调度 在串行调度中,属于同一事务的指令紧挨在一起 对于有n个事务的事务组,可以有n!个有效调度 并行调度 在并行调度中,来自不同事务的指令可以交叉执行 当并行调度等价于某个串行调度时,则称它是正确的
23
事务调度 并行 Vs 串行 基本比较 并行的优点 并行事务会破坏数据库的一致性 串行事务效率低
一个事务由不同的步骤组成,所涉及的系统资源也不同。这些步骤可以并发执行,以提高系统的吞吐量 系统中存在着周期不等的各种事务,串行会导致难于预测的时延。如果各个事务所涉及的是数据库的不同部分,采用并发会减少平均响应时间
24
事务调度 事务执行示例 T2 read(A); T1 temp := A0.1 read(A); A := A temp;
的10%到B 开始状态: A=1000¥ B=2000¥ A+B=3000¥ 从A过户 50¥到B T2 read(A); temp := A0.1 A := A temp; write(A); read(B); B := B + temp; write(B); T1 read(A); A := A 50; write(A); read(B); B := B + 50; write(B);
25
事务调度 T1 T2 read(A); read(A); write(A); 串 A := A 50; 行 write(A); 调
read(B); B := B + 50; write(B); 串 行 调 度 1 read(A); temp := A0.1 A := A temp; write(A); read(B); B := B + temp; write(B); A=950¥ B=2050¥ 结束状态: A=855¥ B=2145¥ A+B=3000¥
26
事务调度 T1 T2 read(A); write(A); read(A); 串 temp := A0.1 行
A := A temp; write(A); read(B); B := B + temp; write(B); 串 行 调 度 2 read(A); A := A 50; write(A); read(B); B := B + 50; write(B); A=900¥ B=2100¥ 结束状态: A=850¥ B=2150¥ A+B=3000¥
27
事务调度 T1 T2 read(A); read(A); write(A); 并 A := A 50; 行 write(A); 调 度
3 A=950¥ B=2000¥ read(A); temp := A0.1 A := A temp; write(A); A=855¥ B=2000¥ read(B); B := B + 50; write(B); A=855¥ B=2050¥ 结束状态: A=855¥ B=2145¥ A+B=3000¥ read(B); B := B + temp; write(B);
28
事务调度 可恢复调度 事务的恢复:一个事务失败了,应该能够撤消该事务对数据库的影响。如果有其它事务读取了失败事务写入的数据,则该事务也应该撤消 不可恢复的调度 T1 T2 可恢复调度 对于每对事务T1与T2,如果T2读取了T1所写的数据,则T1必须先于T2提交 read(A); write(A); read(A); commit read(B); rollback;
29
事务调度 T1 T2 T3 无级联调度 级联调度 无级联调度 由于一个事务故障而
导致一系列事务回滚 无级联调度 对于每对事务T1与T2, 如果T2读取了T1所写 的数据,则T1必须在 T2读取之前提交 read(A); read(B); write(A); T1 T2 read(A) T3 rollback; 无级联调度必是可恢复调度
30
事务隔离性级别:丢失修改 T1 T2 read(A); read(A); write(A); read(B); write(A); 并
A := A 50; 并 行 调 度 4 A=1000¥ B=2000¥ read(A); temp := A0.1 A := A temp; write(A); read(B); 两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改丢失 A=900¥ B=2000¥ write(A); read(B); B := B + 50; write(B); A=950¥ B=2000¥ A=950¥ B=2050¥ 结束状态: A=950¥ B=2100¥ A+B=3050¥ B := B + temp; write(B);
31
事务隔离性级别:读脏数据 T1 T2 write(A); read(A); 并 A := A 50; 行 调 度 5 read(A);
B=2000¥ 事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤消,这时T1已修改过的数据恢复原值,T2读到的数据与数据库中数据不一致,则T2读到的数据就是脏数据 read(A); A1 := A; read(B); B1 := B; A1 + B1 = 2950; read(B); B := B + 50; write(B);
32
事务隔离性级别:不能重复读 T1 T2 read(A); write(A); read(B); 并 A1 := A 行 调 度
6 A=1000¥ B=2000¥ read(A); A := A 50; write(A); read(B); B := B + 50; write(B); 事务T1读取某一数据后,事务T2对其做了修改,当T1再次读取该数据时,得到与前次不同的值 read(B); B1 := B A1+B1=3050 A=950¥ B=2050¥
33
事务隔离性级别:发生幻象 T1 T2 select * insert into SC from SC
where CNO = C01 and SNO = S01 insert into SC values(S01, C01, null)
34
事务隔离性级别 SQL中隔离性级别的定义 serializable:一个调度的执行必须等价于一个串行调度的结果
repeatable read:只允许读取已提交的记录,并要求一个事务对同一记录的两次读取之间,其它事务不能对该记录进行更新 read committed:只允许读取已提交的记录,但不要求可重复读 read uncommitted:允许读取未提交的记录
35
冲突可串行化 指令的顺序 考虑一个调度S中的两条连续指令(仅限于read与 write操作)Ii与Ij,分别属于事务Ti与Tj
①Ii = read(Q), Ij = read(Q); ②Ii = read(Q), Ij = write(Q); ③Ii = write(Q), Ij = read(Q); ④Ii = write(Q), Ij = write(Q); 在① 情况下,Ii与Ij的次序无关紧要。其余情况下,Ii与Ij的次序不同,其执行结果也不同,数据库最终状态也不同
36
冲突可串行化 冲突指令 冲突等价 当两条指令是不同事务在相同数据项上的操作,并且其中至少有一个是write指令时,则称这两条指令是冲突的
如在②、③、④情况下,Ii与Ij 是冲突的 非冲突指令交换次序不会影响调度的最终结果 冲突等价 如果调度S可以经过一系列非冲突指令交换转换成调度S',则称调度S与S'是冲突等价的
37
冲突可串行化 T1 T2 T1 T2 并 行 调 度 3 read(A); write(A); read(A); write(A);
read(B); read(B); write(B); write(A); 1 write(B); read(B); write(B); read(B); write(B); read(A); write(A); read(B); write(B); read(A); write(A); read(B); read(A); write(A); 2 3 read(A); write(A); write(B); read(B); write(B); read(B); write(B);
38
冲突可串行化 T1 T2 冲突可串行化 当一个调度S与一个串行调度冲突等价时,则称该调度是冲突可串行化的 如并行调度3是冲突可串行化的
read(A); T1 T2 write(A); 非冲突串行化的例子: 存在结果相同,但非冲突等价的调度
39
冲突可串行化 T1 T2 T1 T2 read(A); A := A - 50 write(A); read(A); A := A - 50
read(B); B := B + 50 write(B); A=950¥ B=2000¥ read(B); B := B - 10 write(B); A=950¥ B=1990¥ A=950¥ B=2050¥ 冲突指令 read(B); B := B + 50 write(B); read(B); B := B - 10 write(B); read(A); A := A + 10 write(A); A=950¥ B=2040¥ read(A); A := A + 10 write(A); A=960¥ B=2040¥ A=960¥ B=2040¥
40
冲突可串行化判定 优先图(precedence graph)
一个调度S的优先图是这样构造的:它是一个有向图G =(V,E),V是顶点集,E是边集。顶点集由所有参与调度的事务组成,边集由满足下述条件之一的边Ti Tj组成: ①在Tj执行read(Q)之前,Ti执行write(Q) ②在Tj执行write(Q)之前,Ti执行read(Q) ③在Tj执行write(Q)之前,Ti执行write(Q)
41
冲突可串行化判定 T1 T2 T1 T2 T2 T1 T2 T1 write(A); write(A); write(A);
并 行 调 度 3 read(A); write(A); read(A); 并 行 调 度 4 read(A); write(A); read(B); read(A); write(A); read(B); write(B); write(A); read(B); write(B); read(B); write(B); write(B); T2 T1 T2 T1
42
冲突可串行化判定 T2 T1 T2 T1 如果优先图中存在边TiTj ,则在任何等价于S的串行调度S'中,Ti都必须出现在Tj之前
冲突可串行化判定准则 如果调度S的优先图中有环,则调度S是非冲突可串行化的。如果图中无环,则调度S是冲突可串行化的 T2 T1 T2 T1 并行调度3是冲 突可串行化的 并行调度4是非 冲突可串行化的
43
冲突可串行化判定 T1 T1 T2 T3 T4 T2 T3 T1 T3 T2 T4 T4 与冲突可串行化等价的串行顺序
串行顺序可由拓扑排序得到,求出与优先图的偏序相一致的线序 T1 T1 T2 T3 T4 T2 T3 T1 T3 T2 T4 T4
44
视图可串行化 视图等价 考虑关于某个事务集的两个调度S,S',若调度S,S'满足以下条件,则称它们是视图等价的:
①对于每个数据项Q,若事务Ti在调度S中读取了Q的初始值,那么Ti在调度S'中也必须读取Q的初始值 ②对于每个数据项Q,若事务Ti在调度S中执行了read(Q),并且读取的值是由Tj产生的,那么Ti在调度S'中读取的Q值也必须是由Tj产生的 ③对于每个数据项Q,若在调度S中有事务执行了最后的write(Q),则在调度S'中该事务也必须执行最后的write(Q)
45
视图可串行化 T1 T1 T2 T2 read(A); read(A); write(A); write(A); write(A);
注:条件①、②保证两个调度中的每个事务都读取相同的值,从而进行相同的计算 条件①、②、③保证两个调度得到最终相同的系统状态 T1 T2 T1 T2 视图等价 read(A); write(A); read(B); write(B); read(A); write(A); read(A); write(A); 由T1产生的A值 read(A); write(A); read(B); write(B); read(B); write(B); 由T1产生的A值 read(B); write(B);
46
视图可串行化 T1 T1 T2 T2 read(A); write(A); write(A); read(A); write(A);
非视图等价 read(A); write(A); read(B); write(B); read(A); write(A); read(B); write(B); 调度执行前的A值 read(A); write(A); read(B); write(B); read(A); write(A); read(B); write(B); 由T1产生的A值
47
视图可串行化 T1 T2 T3 视图可串行化 如果某个调度视图等价于一个串行调度,则称该调度是视图可串行化的
冲突可串行化调度一定是视图可串行化的 存在视图可串行化但非冲突可串行化的调度 T1 T2 T3 视图等价 read(Q); < T1, T2, T3 > write(Q); write(Q); write(Q); 盲目写操作
48
视图可串行化判定 T1 T2 T3 T2 T1 T3 read(Q); write(Q); write(Q); write(Q);
非冲突可串行化 无用的写操作
49
视图可串行化判定 带标记的优先图的构造 设调度S包含了事务{T1, T2, … , Tn},设Tb, Tf是两个虚事务,其中Tb为S中所有write(Q)操作, Tf为S中所有read(Q)操作。在调度S的开头插入Tb ,在调度S的末尾插入Tf,得到一个新的调度S' ①如果Tj读取Ti写入的数据项的值,则加入边Ti Tj ②删除所有关联无用事务的边。如果在优先图中不存在从Ti到Tf的通路,则Ti是无用事务 ③对于每个数据项Q,如果Tj读取Ti读取写入的Q值, Tk执行write (Q)操作且Tk≠Tb ,则:
50
视图可串行化判定 ⒈如果Ti = Tb且Tj≠Tf,则在带标记的优先图中插入边Tj Tk
⒉如果Ti≠Tb且Tj = Tf,则在带标记的优先图中插入边Tk Ti ⒊如果Ti≠Tb且Tj≠Tf,则在带标记的优先图中插入边Tk Ti与Tj Tk 。其中p是一个唯一的,在前面边的标记中未曾用过的大于0的整数
51
视图可串行化判定 T1 T1 T2 read(A); Tb Tf write(A); write(A); T2
52
视图可串行化判定 T1 T1 T2 T3 Tb T2 Tf T3 read(Q); write(Q); write(Q);
read(Q); Tb T2 Tf write(Q); write(Q); write(Q); T3
53
视图可串行化判定 T1 T1 T2 T3 Tb T2 Tf T3 read(Q); write(Q); read(Q); write(Q);
1 1 read(Q); Tb T2 Tf write(Q); read(Q); write(Q); write(Q); T3
54
判定准则:只要有一个优先图无环,则调度是视图可串行化的
视图可串行化判定 T1 T1 1 Tb Tb T2 Tf T2 Tf 1 T3 T3 每个优先图包含标号大于1的边对中的一条 判定准则:只要有一个优先图无环,则调度是视图可串行化的
Similar presentations