第7章数据库安全与保护内容摘要:

salary=10000) 0 BEGIN PRINT 39。 工资必须大于 1000元 , 小于 10000元 !39。 ROLLBACK TRANSACTION END 插入一个老师信息,设定工资为 800元,测试该触发器的 SQL语句如下: INSERT INTO T VALUES(’T010’, ’成洁’ , ’女’ , ’196553’, ’讲师’ ,800, ’87654903’, ’2’) 执行结果: 工资必须大于 1000元 , 小于 10000元 ! 可见,触发器 Ins_teacher也正常地发挥了作用。 事务  定义 事务 (transaction)是构成单一逻辑工作单元 的操作集合。  性质  原子性 (Atomicity):事务 是一个不可分割的工作单元。  一致性 (Consistency) :即数据不会应事务的执行而遭受破坏。 隔离性 (Isolation) :在多个事务并发执行时,系统应保证与这些事务先后单独执行时的结果一样。 持久性 (Durability) :一个事务一旦完成全部操作后,它对数据库的所有更新应永久地反映在数据库中。 例子:事务及其性质 问题: 设银行数据库中有一转账事务 T,从账号 A转一笔款子( $50)到账号 B。 相应的事务: T: read( A) ; A:=A–50; write( A) ; read( B) ; B:=B + 50; write( B) .  原子性( A,B同时被修改或同时保持原值)  一致性( A+B的值不变)  隔离性  持久性 例 假设某公司在华东地区设立了一个配送中心 ,负责向其在上海、杭州和南京的分公司输原料。 现在要从配送中心发送数量为 Quantity 、 编号为 Gno1 的商品到其在上海的分公司。 设配送中心的商品库存信息存放在 CenterInventory( Gno ,QTY, … )关系中 , 而上海分公司的商品库存信息存放在 ShanghaiInventory(Gno,QTY, … )关系中 ,其中 Gno和 QTY属性分别代表商品编号及其库存量。 试编写一事务 Tl完成相关操作。 解: ... /* 读出配送中心关于商品 Gno1 的库存量 QTY */ EXEC SQL SELECT QTY INTO:MQTY FROM CenterInventory WHERE Gno=:Gno1; /* 从配送中心商品库存信息 CenterInventory 表中减去 Gno1 商品的库存量 */ EXEC SQL UPDATE CenterInventory SET QTY=QTY :quantity WHERE Gno=:Gno1; IF (MQTYquantity) { print(" 库存不足 , 不能配送 !); ROLLBACK TRANSACTION; /* 恢复事务 , 撤消所有操作串 */ } ELSE {/* 从上海商品库存信息 ShanghaiInventory 表中增加 Gno1 商品的库存量 */ EXEC SQL UPDATE ShanghaiInventory SET QTY=QTY+:quantity WHERE Gno=:Gno1; COMMIT TRANSACTION:/* 提交事务 */ } 并发操作与数据的不一致性 并发操作可能带来的数据不一致性情况有三种 : 丢失修改 、 读过时数据和读 “ 脏 ” 数据。 封锁 (1) 排它锁和共享锁 排它锁和共享锁是最基本的封锁方式 . 如果事务 T 对数据对象 Y 加上了 排它锁 (记为 X 锁 ),那么 T 既可以读取 Y ,也可以更新 Y。 如果事务 T 对数据对象 Y 加上了 共享锁 ( 记为 S 锁 ),那么 T 可以读取 Y,但不能更新 Y。 封锁的粒度  封锁对象的大小称为封锁的粒度( granularity)  封锁的对象  逻辑单元 :属性值、属性值集合、元组、关系、索引项、整个索引、整个数据库  物理单元 :页(数据页或索引页)、块  封锁粒度与系统并发度和并发控制开销密切相关。 粒度越大,系统中能被封锁的对象就越少,并发度就越小,但同时系统的开销也就越小;相反,粒度越小,并发度越高,系统开销越大 (2) 封锁协议 所谓封锁协议就是在对数据对象加锁、持锁和释放锁时所约定的一些规则。  一级封锁协议 一级封锁协议规定事务 T 在更新数据对象以前 ,必须对该数据对象加排它锁 ,并且直到事务 T 结束时才可以释放该锁。 利用一级封锁协议可以防止丢失更新问题的发生 .  二级封锁协议 二级封锁协议规定事务 T 在更新数据对象以前必须对数据对象加 X 锁 ,且直到事务 T 结束时才可以释放该锁 ,还规定事务 T 在读取数据对象以前必须先对其加 S 锁 ,读完后即可释放 S 锁。 可以防止丢失更新问题 , 还可以防止未提交依赖问题 ,但却不能防止不一致性分析问题。 三级封锁协议 三级封锁协议规定事务 T 在更新数据对象以前 , 必须对数据对象加 X 锁 , 且直到事务 T 结束时才可以释放该锁 , 还规定事务 T 在读取数据对象以前必须先对其加 S 锁 , 该 S 锁也必须在事务 T 结束时才可释放。 可以防止丢失更新和未提交依赖问题 ,此外还可以防止不一致性分析问题的发生。 封锁带来的问题 1(活锁) T1 XFIND A T2 XFIND A T3 XFIND A A A已被封锁,不成功,等待 A刚被释放,成功 A刚被 T2释放,成功 …… T1永远等待 活锁。 解决方法:先来先服务 封锁带来的问题 2饿死 事务序列 A1 A2 A3 A4 A5 … 资源 A T2 T2永远不 能封锁 解决方法,改变授权方式: 当事务 T2中请对数据项 Q加 S锁时,授权加锁的条件是: ① 不存在在数据项 Q上持有 X锁的其他事务; ② 不存在等待对数据项 Q加锁且先于 T2申请加锁的事务 每一个事务均请求A的 S锁,成功后一段时间释放 请求 A的 X锁 封锁带来的问题 3死锁 时间 事务 T1 事务 T2 t0 XFIND A t1 XFIND B t2 XFIND B。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。