第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。第7章数据库安全与保护
相关推荐
.. 39。 gui_Callback39。 , [])。 if nargin amp。 amp。 ischar(varargin{1}) = str2func(varargin{1})。 end if nargout [varargout{1:nargout}] = gui_mainf(gui_State, varargin{:})。 else gui_mainf(gui_State,
提供多数应用程 序公用的功能 2.线程基类: CWinThread类 所有线程的基类,可直接使用。 CWinApp类就是从CWinThread类中派生出来的 12 4.文档 /视类 文档对象由文档模板对象创建,管理应用程序的数据。 视对象表示一个窗口的客户区,显示文档数据并允许用户与之交互 3.窗口应用程序类: CWinApp类 每个应用程序有且只有一个应用程序对象
23521 jj ezzezz ==,=,=))()((= 15151 00 1)( zezezzH jj于是: 研究当 时,仅仅由一个系数 的量化所引起的极点 的变化 031 == aa 2a1z 1z))((== 00 55 23121211 ))(( jj eeazzzzazz若字长为 8位 , 由量化引起的误差 q/2可达大约 , 求得 ,
” IZ EXIT ;否 , 正常退出 TEST AH, 20H ;是否 “ 纸尽 ” JZ OFF_LINE ;否。 转脱机处理 LEA DX, CS: MESG_3 ;取 “ 纸尽信息 ” JMP DISP ;转显示 OFF_LINE: LEA DX, CS: MESG_2 ;取 “ 脱机信息 ” DISP: DEC SI ;恢复原入口指针 第 7章 打印接口及串行通信接口 PUSH DS
出中标结果 中标人接受中标通知书、未中标人接受中标结果 招标人与中标人签署合同协议 办理、提交支付担保 办理、提交履约担保 退回中标人及未中标人投标保证金 接受投标保证金回执 办理合同备案 建设行政主管部门接受备案 图 7- 1( 4) 施工招标投标程序 工作阶段 招标人 投标人 监督管理部门 工程项目施工招投标程序 2.招标阶段的主要工作内容 从发布招标广告 (投标邀请函 )开始