版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第八章 系统实现技术 事务和锁,本章重要概念,(1)事务的定义,COMMIT和ROLLBACK的语义,事务的ACID性质,事务的状态变迁图。 (2)存储器类型,稳定存储器的实现,数据传送过程。 (3)恢复的定义、基本原则和实现方法,故障的类型,检查点技术,REDO和UNDO操作,运行记录优先原则。 (4)并发操作带来的三个问题,X锁、S锁、使用X锁和S锁的操作,封锁协议,活锁、饿死和死锁,并发调度、串行调度、并发调度的可串行化,SQL中事务的存取模式和隔离级别,基于时标的并发控制。,第8章 系统实现技术,8.1 事务 8.2 数据库的恢复 8.3 数据库的并发控制,8.1 事务,8.1.1 事
2、务的定义 8.1.2 事务的ACID性质,为什么需要事务8.1-1,例如,银行转帐问题: 假定资金从帐户A转到帐户B,至少需要两步: 帐户A的资金减少 然后帐户B的资金相应增加,为什么需要事务8.1-2,CREATE TABLE bank ( customerName CHAR(10), -顾客姓名 currentMoney MONEY -当前余额 ) GO ALTER TABLE bank ADD CONSTRAINT CK_currentMoney CHECK(currentMoney=1) GO INSERT INTO bank(customerName,currentMoney) VA
3、LUES(张三,1000) INSERT INTO bank(customerName,currentMoney) VALUES(李四,1),创建帐户表,存放用户的帐户信息,添加约束:根据银行规定,帐户余额不能少于1元,否则视为销户,张三开户,开户金额为1000元 ;李四开户,开户金额1元,为什么需要事务8.1-3,目前两个帐户的余额总和为:1000+1=1001元,为什么需要事务8.1-4,模拟实现转帐 : 从张三的帐户转帐1000元到李四的帐户,/*-转帐测试:张三转账1000元给李四-*/ -我们可能会这样这样编写语句 -张三的帐户少1000元,李四的帐户多1000元 UPDATE ba
4、nk SET currentMoney=currentMoney-1000 WHERE customerName=张三 UPDATE bank SET currentMoney=currentMoney+1000 WHERE customerName=李四 GO -再次查看转帐后的结果。 SELECT * FROM bank GO,请问:执行转帐语句后,张三、李四的帐户余额为多少?,张三的帐户没有减少 但李四的帐户却多了1000元 100010012001元 总额多出了1000元!,为什么需要事务8.1-5,-张三的帐户减少1000元,李四的帐户增加1000元 UPDATE bank SET
5、currentMoney=currentMoney-1000 WHERE customerName=张三 UPDATE bank SET currentMoney=currentMoney+1000 WHERE customerName=李四 GO,错误原因分析:,UPDATE语句违反约束:余额=1元,执行失败,所以张三还是1000元,继续往下执行:执行成功,所以李四变为1001元,如何解决呢?使用事务,8.1.1 事务的定义(1),定义8.1 事务(transaction)是构成单一逻辑工作单元的操作集合,要么完整地执行,要么完全不执行。不论发生何种情况,DBS必须保证事务能正确、完整地执行
6、。 在程序中,事务以BEGIN TRANSACTION语句开始,以COMMIT语句或ROLLBACK语句结束。 COMMIT语句表示事务执行成功地结束(提交),此时告诉系统,数据库要进入一个新的正确状态,该事务对数据库的所有更新都已交付实施(写入磁盘)。 ROLLBACK语句表示事务执行不成功地结束(应该“回退”),此时告诉系统,已发生错误,数据库可能处在不正确的状态,该事务对数据库的所有更新必须被撤消,数据库应恢复该事务到初始状态。,用户定义的一个对数据库读写操作序列 一个不可分割的工作单位 数据库恢复和并发控制的基本单位 数据库系统中通常有多个事务并行运行 事务和程序比较 在关系数据库中,
7、一个事务可以是一条或多条SQL语句,也可以包含一个或多个程序。 一个程序通常包含多个事务,转帐过程就是一个事务。 它需要两条UPDATE语句来完成,这两条语句是一个整体,如果其中任一条出现错误,则整个转帐业务也应取消,两个帐户中的余额应恢复到原来的数据,从而确保转帐前和转帐后的余额不变,即都是1001元。,8.1.1 事务的定义(2),8.1.1 事务的定义(3),例8.1 设银行数据库中有一转账事务T,从账号A转一笔款子($50)到账号B,其操作如下: T:read(A); A:=A50; write(A); read(B); B:=B + 50; write(B).,组织成如下事务: T:
8、BEGIN RANSACTION; read(A); A:=A-50; write(A); if(A0)ROLLBACK;else read(B); B:=B+50; write(B); COMMIT;,8.1.1 事务的定义(4),对数据库的访问是建立在读和写两个操作的基础上的: read(X):把数据X,从磁盘的数据库中读到内存的缓冲区中。 write(X):把数据X,从内存缓冲区中写回磁盘的数据库。 在系统运行时,write操作未必导致数据立即写回磁盘,很可能先暂存在内存缓冲区中,稍后再写回磁盘。这件事情是DBMS实现时必须注意的问题。,8.1.2 事务的ACID性质,性质: 原子性(A
9、tomicity): 事务是一个不可分割的工作单元,事务中的操作要么都做,要么都不做 (All or None) 一致性(Consistency): 即数据不会应事务的执行而遭受破坏。事务执行的结果必须使数据库从一个一致性状态变到另一个一致性状态。与原子性密切相关。 隔离性(Isolation): 在多个事务并发执行时,系统应保证与这些事务先后单独执行时的结果一样。 持久性(Durability): 一个事务一旦完成全部操作后,它对数据库的所有更新应永久地反映在数据库中。,8.2 数据库的恢复,8.2.1 存储器结构 8.2.2 恢复的基本原则和实现方法 8.2.3 故障类型和恢复方法 8.2
10、.4 检查点技术 8.2.5 SQL对事务的支持,8.2.1 存储器结构(1),1.存储器类型 易失性存储器(volatile storage) 内存、cache存储器 非易失性存储器(nonvolatile storage) 磁盘和磁带 稳定存储器(stable storage) 这是一个理论上的概念。存储在稳定存储器中的信息是决不会丢失的。 2.稳定存储器的实现 数据备份 数据银行,8.2.1 存储器结构(2),3. 数据访问 块、物理块和缓冲块 块的操作 input(A):把物理块A的内容传送到内存的缓冲块中。 Output(B):把缓冲块B的内容传送到磁盘中恰当的物理块中,8.2.1
11、存储器结构(3),8.2.1 存储器结构(4),4. 恢复和原子性的联系,8.2.2恢复的基本原则和实现方法,基本原则 :“冗余”,即数据库重复存储。 具体实现方法 平时做好两件事:转储和建立日志 周期地(比如一天一次)对整个数据库进行拷贝,转储到另一个磁盘或磁带一类存储介质中。 建立日志数据库。记录事务的开始、结束及数据每一次插入、删除和修改前后的值,并写到“日志”库中。 一旦发生数据库故障,分两种情况进行处理 如果数据库已被破坏,则装入last数据库备份,再利用日志库将这两个数据库状态之间的所有更新重新做一遍。 如果数据库未被破坏,但某些数据不可靠,则撤消所有不可靠的修改,把数据库恢复到正
12、确的状态。,8.2.3 故障类型和恢复方法(1),1.事务故障 可以预期的事务故障,如存款余额透支等 非预期事务故障,如运算溢出、数据错误、死锁等 2.系统故障:硬件故障、软件错误或掉电等,重新启动时,具体处理分两种情况考虑。 对未完成事务作UNDO处理; 对已提交事务但更新还留在缓冲区的事务进行REDO处理。,8.2.3 故障类型和恢复方法(2),3介质故障 在发生介质故障和遭受病毒破坏时,磁盘上的物理数据库遭到毁灭性破坏。此时恢复的过程如下: 重装最近转储的后备副本到新的磁盘,使数据库恢复到转储时的一致状态。 在日志中找出最近转储以后所有已提交的事务。 对这些已提交的事务进行REDO处理,
13、将数据库恢复到故障前某一时刻的一致状态。 在实际中,系统故障通常称为软故障(Soft Crash),介质故障通常称为硬故障(Hard Crash)。,8.2.4 检查点技术(1),1检查点方法 在DBS运行时,DBMS定时设置检查点。在检查点时刻才真正做到把对DB的修改写到磁盘,并在日志文件写入一条检查点记录(以便恢复时使用)。当DB需要恢复时,只有那些在检查点后面的事务需要恢复。,事务T1不必恢复; 事务T2和事务T4必须重做(REDO); 事务T3和事务T5必须撤消(UNDO)。,8.2.4 检查点技术(2),2检查点方法的恢复算法:分成两步。 (1)根据日志文件建立事务重做队列和事务撤销
14、队列。此时,从头扫描日志文件(正向扫描)。 (2)对重做队列中的事务进行REDO处理,对撤销队列中的事务进行UNDO处理。 进行REDO处理的方法是:正向扫描日志文件,根据重做队列的记录对每一个重做事务重新实施对数据库的更新操作。 进行UNDO处理的方法是:反向扫描日志文件,根据撤销队列的记录对每一个撤销事务的更新操作执行逆操作。,8.2.5 SQL对事务的支持,无begin transaction Commit Rollback,8.3 数据库的并发控制,8.3.1 并发操作带来的三个问题 8.3.2 封锁技术 8.3.3 封锁带来的问题 8.3.4 并发操作的调度 8.3.5 SQL对事务
15、处理的支持,8.3.1并发操作带来的三个问题(1),图8.5 在时间t8丢失了事务T1的更新 (FIND表示从DB中读值,UPD表示把值写回到DB),1丢失更新问题(例8.2),8.3.1并发操作带来的三个问题(2),图8.6 事务T2在时间t4读了未提交的A值(80),2读脏数据问题(例8.3,用户读了“脏数据”, 但没有破坏数据库的完整性),8.3.1并发操作带来的三个问题(3),图8.8 事务T2在时间t4读了未提交的A值,并在时间t8丢失了自己的更新,2读脏数据问题(例8.4,用户读了“脏数据”,引起 自身的更新操作被丢失,破坏了数据库的完整性),8.3.1并发操作带来的三个问题(4)
16、,图8.8 事务T1两次读取A的值,却得到了不同的结果,3.不可重复读问题(例8.5),8.3.1并发操作带来的三个问题(5),解决方法:,8.3.2 封锁技术(1),定义8.3 锁(lock)是一个与数据项相关的变量,对可能应用于该数据项上的操作而言,锁描述了该数据项的状态。 通常在数据库中每个数据项都有一个锁。锁的作用是使并发事务对数据库中数据项的访问能够同步。 封锁技术中主要有两种封锁: 排他型封锁 共享型封锁,8.3.2 封锁技术(2),1.排他型封锁(X锁,写锁) X锁定义:如果事务T对某个数据R(可以是数据项、记录、数据集乃至整个数据库)实现了X锁,那么在T对数据R解除封锁之前,不
17、允许其他事务T再对该数据加任何类型的锁。这种锁称为“X锁”。 X锁的操作有两个: 封锁操作 “XFIND R”:表示事务对数据R申请加X锁,若成功,则可以读或写数据R,若不成功,那么这个事务将进入等待队列,直到获得X锁,事务才继续做下去。 解锁操作 “XRELEASE R”:表示事务要解除对数据R的X锁 X锁的解除操作应该合并到事务的结束(COMMIT或ROLLBACK)操作中。,8.3.2 封锁技术(3),例8.6 使用X锁技术,可以解决图8.5的丢失更新问题。,图8.9 等事务T1更新完成后再执行事务T2,2共享型封锁(S锁,读锁) 定义8.5 如果事务T对某数据加上S锁后,仍允许其他事务
18、再对该数据加S锁,但在对该数据的所有S锁都解除之前决不允许任何事务对该数据加X锁。 S锁的操作有三个: 封锁操作 “SFIND R 升级和写操作 “UPDX R” 解锁操作 “SRELEASE R” 可以看出,获准S锁的事务只能读数据,不能更新数据,若要更新,则先要把S锁升级为X锁。 另外,由于S锁只允许读数据,因此解除S锁的操作不必非要合并到事务的结束操作中去,可以随时根据需要解除S锁。,8.3.2 封锁技术(4),8.3.2 封锁技术(5),例8.8 使用S锁技术,也可以解决图8.5的丢失更新问题。,图8.10 更新未丢失,但在时间t6发生了死锁,注: N=NO,不相容的请求 Y=YES,
19、相容的请求 X、S、: 分别表示X锁,S锁,无锁 如果两个封锁是不相容 的,则后提出封锁的事务 要等待。,8.3.2 封锁技术(6),3封锁的相容矩阵,4封锁的粒度 定义8.6 封锁对象的大小称为封锁的粒度。 封锁的对象 逻辑单元:属性值、属性值集合、元组、关系、索引项、整个索引、整个数据库 物理单元 :页(数据页或索引页)、块 封锁粒度与系统并发度和并发控制开销密切相关。粒度越大,系统中能被封锁的对象就越少,并发度就越小,但同时系统的开销也就越小;相反,粒度越小,并发度越高,系统开销越大。 选择封锁粒度时必须同时考虑封锁机构与并发度两个因素,对系统开销与并发度进行权衡。,8.3.2 封锁技术
20、(8),5封锁协议:三级封锁协议,分别在不同程度上解决了并发操作带来的各种问题,为并发操作的正确调度提供一定的保证。,8.3.2 封锁技术(8),8.3 数据库的并发控制,8.3.1 并发操作带来的三个问题 8.3.2 封锁技术 8.3.3 封锁带来的问题 8.3.4 并发操作的调度 8.3.5 SQL对事务处理的支持,8.3.3 封锁带来的问题(1),1“活锁”问题 定义8.8 系统可能使某个事务永远处于等待状态,得不到封锁的机会,这种现象称为“活锁”(Live Lock)。 解决活锁问题的一种简单的方法是采用“先来先服务”的策略,也就是简单的排队方式。 如果运行时,事务有优先级,那么很可能
21、使优先级低的事务,既使排队也很难轮上封锁的机会。此时可采用“升级”方法来解决,也就是当一个事务等待若干时间(譬如5分钟)还轮不上封锁时,可以提高其优先级别,这样总能轮上封锁。,8.3.3 封锁带来的问题(2),2“饿死”问题 定义8.8 有可能存在一个事务序列,其中每个事务都申请对某数据项加S锁,且每个事务在授权加锁后一小段时内释放封锁,此时若另有一个事务T2欲在该数据项上加X锁,则将永远轮不上封锁的机会。这种现象称为“饿死”(starvation)。 可以用下列方式授权加锁来避免事务饿死。当事务T2中请对数据项Q加S锁时,授权加锁的条件是: 不存在在数据项Q上持有X锁的其他事务; 不存在等待
22、对数据项Q加锁且先于T2申请加锁的事务。,8.3.3 封锁带来的问题(3),3. “死锁”问题 定义8.9 系统中有两个或两个以上的事务都处于等待状态,并且每个事务都在等待其中另一个事务解除封锁,它才能继续执行下去,结果造成任何一个事务都无法继续执行,这种现象称系统进入了“死锁”(Dead Lock)状态。,图8.12 在时间t4 两个事务发生死锁,8.3.3 封锁带来的问题(4),我们可以用事务依赖图的形式测试系统中是否存在死锁。图中每一个结点是“事务”,箭头表示事务间的依赖关系。 图8.14为无环依赖图,表示系统未进入死锁状态; 而图8.15为有环依赖图,则表示系统进入死锁状态。,8.3.
23、3 封锁带来的问题(5),DBMS中有一个死锁测试程序,每隔一段时间检查并发的事务之间是否发生死锁。 如果发生死锁,那么只能抽取某个事务作为牺牲品,把它撤消,做回退操作,解除它的所有封锁,恢复到该事务的初始状态。释放出来的资源就可以分配给其他事务,使其他事务有可能继续运行下去,就有可能消除死锁现象。 理论上,系统进入死锁状态时可能会有许多事务在相互等待,但是System R的实验表明,实际上绝大部分的死锁只涉及到两个事务,也就是事务依赖图中的循环里只有两个事务。有时,死锁也被形象地称作“死死拥抱”(Deadly Embrace)。,8.3 数据库的并发控制,8.3.1 并发操作带来的三个问题 8.3.2 封锁技术 8.3.3 封锁带来的问题 8.3.4 并发操作的调度 8.3.5 SQL对事务处理的支持,事务的调度:事务的执行次序称为“调度” 。 串行调度:如果多个事务依次执行,则称为事务的串行调度(Serial Schedule)。 并发调度:如
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工地应急预案(14篇)
- 工程建设承包合同(集锦15篇)
- 2025工程(通信设备租赁)合同
- 2026年小学教师资格证《学科知识与教学能力》考试试题及答案
- 2026年软考-系统集成项目管理工程师历年真题
- 2026年行政人员公章与证照管理培训计划
- 生产计划调整管理规定
- 2026年销售上半年工作总结及下半年计划2篇
- 2026年氩弧焊安全操作规程及注意事项
- 胃切除术前准备护理评估单
- 2026届广东省汕头市重点中学中考历史模拟试题含解析
- 2026中国电气装备储能科技有限公司社会招聘笔试历年参考题库附带答案详解
- JJF 2381-2026钢直尺检定仪校准规范
- 2026年德州市德城区公开招聘城市社区专职工作者(100人)笔试备考题库及答案解析
- 2026届山东省济南市高三二模语文试题(含答案)
- 织颜窗帘重塑织颜4P盈利模型
- 2026年度“市委书记进校园”佳木斯市急需紧缺专业技术人才引进286人(哈尔滨师范大学专场)笔试参考试题及答案解析
- 2025年西安交通大学辅导员招聘笔试真题附答案
- Module5Unit2Getoffthesofa课件-外研版九年级英语下册
- 2026新版人教版小学数学3三年级下册(全册)教案设计
- 特应性皮炎外用治疗与管理专家共识(2025版)
评论
0/150
提交评论