《系统实现技术》PPT课件.ppt
第八章第八章 系统实现技术系统实现技术 事务和锁事务和锁本章重要概念本章重要概念 (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 事务事务8.1.1 事务的定义 8.1.2 事务的ACID性质 为什么需要事务为什么需要事务8.1-18.1-1例如,银行转帐问题:例如,银行转帐问题:假定资金从帐户假定资金从帐户A A转到帐户转到帐户B B,至少需要两步:,至少需要两步:帐户帐户A A的资金减少的资金减少然后帐户然后帐户B B的资金相应增加的资金相应增加银行转帐帐户帐户A帐户帐户B为什么需要事务为什么需要事务8.1-28.1-2CREATE TABLE bank(customerName CHAR(10),-顾客姓名 currentMoney MONEY -当前余额)GOALTER TABLE bank ADD CONSTRAINT CK_currentMoney CHECK(currentMoney=1)GOINSERT INTO bank(customerName,currentMoney)VALUES(张三,1000)INSERT INTO bank(customerName,currentMoney)VALUES(李四,1)创建帐户表,存放用户的帐户信息添加约束:根据银行规定,帐户余额不能少于1元,否则视为销户 张三开户,开户金额为1000元;李四开户,开户金额1元 为什么需要事务为什么需要事务8.1-38.1-3目前两个帐户的余额总和为:目前两个帐户的余额总和为:1000+1=1001元元 为什么需要事务为什么需要事务8.1-48.1-4模拟实现转帐:从张三的帐户转帐从张三的帐户转帐1000元到李四的帐户元到李四的帐户/*-转帐测试:张三转账1000元给李四-*/-我们可能会这样这样编写语句-张三的帐户少1000元,李四的帐户多1000元UPDATE bank SET currentMoney=currentMoney-1000 WHERE customerName=张三UPDATE bank SET currentMoney=currentMoney+1000 WHERE customerName=李四GO-再次查看转帐后的结果。SELECT*FROM bankGO请问:执行转帐语句后,张三、李四的帐户余额为多少?l张三的帐户没有减少 l但李四的帐户却多了1000元 l100010012001元 总额多出了1000元!为什么需要事务为什么需要事务8.1-58.1-5-张三的帐户减少1000元,李四的帐户增加1000元UPDATE bank SET currentMoney=currentMoney-1000 WHERE customerName=张三UPDATE bank SET currentMoney=currentMoney+1000 WHERE customerName=李四GO错误原因分析:错误原因分析:UPDATE语句违反约束:余额=1元执行失败,所以张三还是执行失败,所以张三还是1000元元继续往下执行继续往下执行:执行成功,所以李四变为:执行成功,所以李四变为1001元元如何解决呢?使用如何解决呢?使用事务事务 事务的定义事务的定义(1)(1)定定义义8.1 8.1 事事务务(transactiontransaction)是是构构成成单单一一逻逻辑辑工工作作单单元元的的操操作作集集合合,要要么么完完整整地地执执行行,要要么么完完全全不不执执行行。不不论论发发生生何种情况,何种情况,DBSDBS必须保证事务能正确、完整地执行。必须保证事务能正确、完整地执行。在在程程序序中中,事事务务以以BEGIN BEGIN TRANSACTIONTRANSACTION语语句句开开始始,以以COMMITCOMMIT语句或语句或ROLLBACKROLLBACK语句结束。语句结束。COMMITCOMMIT语语句句表表示示事事务务执执行行成成功功地地结结束束(提提交交),此此时时告告诉诉系系统统,数数据据库库要要进进入入一一个个新新的的正正确确状状态态,该该事事务务对对数据库的所有更新都已交付实施(写入磁盘)。数据库的所有更新都已交付实施(写入磁盘)。ROLLBACKROLLBACK语语句句表表示示事事务务执执行行不不成成功功地地结结束束(应应该该“回回退退”),此此时时告告诉诉系系统统,已已发发生生错错误误,数数据据库库可可能能处处在在不不正正确确的的状状态态,该该事事务务对对数数据据库库的的所所有有更更新新必必须须被被撤撤消消,数据库应恢复该事务到初始状态。数据库应恢复该事务到初始状态。用户定义的一个对数据库读写操作序列用户定义的一个对数据库读写操作序列一个一个不可分割不可分割的工作单位的工作单位数据库恢复和并发控制的基本单位数据库恢复和并发控制的基本单位数据库系统中通常有多个事务并行运行数据库系统中通常有多个事务并行运行v事务和程序比较事务和程序比较在关系数据库中,一个事务可以是一条或多条在关系数据库中,一个事务可以是一条或多条SQL语句语句,也可以包含一个或多个程序。也可以包含一个或多个程序。一个程序通常包含多个事务一个程序通常包含多个事务转帐过程就是一个事务。它需要两条UPDATE语句来完成,这两条语句是一个整体,如果其中任一条出现错误,则整个转帐业务也应取消,两个帐户中的余额应恢复到原来的数据,从而确保转帐前和转帐后的余额不变,即都是1001元。事务的定义事务的定义(2)(2)事务的定义事务的定义(3)(3)例例8.1 8.1 设银行行数数据据库中中有有一一转账事事务T T,从从账 号号 A A转 一一 笔笔 款款 子子($50$50)到到账号号B B,其其操操作如下:作如下:T T:readread(A A););A:=AA:=A5050;writewrite(A A););readread(B B););B:=B+50B:=B+50;writewrite(B B).n组织组织成成如下如下事事务务:T T:BEGIN BEGIN RANSACTIONRANSACTION;readread(A A););A:=A-50A:=A-50;writewrite(A A););if(Aif(A0)ROLLBACK0)ROLLBACK;else readelse read(B B););B:=B+50B:=B+50;writewrite(B B););COMMITCOMMIT;事务的定义事务的定义(4)(4)对数据库的访问是建立在读和写两个操作的基础上的:对数据库的访问是建立在读和写两个操作的基础上的:ureadread(X X):把把数数据据X X,从从磁磁盘盘的的数数据据库库中中读读到到内内存的缓冲区中。存的缓冲区中。uwritewrite(X X):把把数数据据X X,从从内内存存缓缓冲冲区区中中写写回回磁磁盘盘的数据库。的数据库。在在系系统统运运行行时时,writewrite操操作作未未必必导导致致数数据据立立即即写写回回磁磁盘盘,很很可可能能先先暂暂存存在在内内存存缓缓冲冲区区中中,稍稍后后再再写写回回磁盘。这件事情是磁盘。这件事情是DBMSDBMS实现时必须注意的问题。实现时必须注意的问题。事务的事务的ACIDACID性质性质性质:v原子性原子性(Atomicity):事务事务是一个不可分割的工作是一个不可分割的工作单元,单元,事务中的操作要么都做,要事务中的操作要么都做,要么都不做么都不做 (All or None)(All or None)v一致性一致性(Consistency):即即数据不会应事务的执行而遭受破坏数据不会应事务的执行而遭受破坏。事务执行的结果必须使事务执行的结果必须使数据库从数据库从一个一致性状态一个一致性状态变到变到另一个一致性状态。另一个一致性状态。与原子性与原子性密切相关。密切相关。v隔离性隔离性(Isolation):在在多个事务并发执行时,系统应保证与这些事务先后单独执行多个事务并发执行时,系统应保证与这些事务先后单独执行时的结果一样。时的结果一样。v持久性持久性(Durability):一一个事务一旦完成全部操作后,它对数据库的所有更新应永久个事务一旦完成全部操作后,它对数据库的所有更新应永久地反映在数据库中。地反映在数据库中。8.2 8.2 数据库的恢复数据库的恢复8.2.1 8.2.1 存储器结构存储器结构 8.2.2 8.2.2 恢复的基本原则和实现方法恢复的基本原则和实现方法8.2.3 8.2.3 故障类型和恢复方法故障类型和恢复方法8.2.4 8.2.4 检查点技术检查点技术8.2.5 SQL8.2.5 SQL对事务的支持对事务的支持 8.2.1 8.2.1 存储器结构存储器结构(1)(1)1.1.存储器类型存储器类型p易失性存储器(易失性存储器(volatile storagevolatile storage)内存内存、cachecache存储器存储器 p非易失性存储器(非易失性存储器(nonvolatile storagenonvolatile storage)磁盘磁盘和磁带和磁带 p稳定存储器(稳定存储器(stable storagestable storage)这是一个理论上的概念。存储在稳定存储器中的信息是决不会这是一个理论上的概念。存储在稳定存储器中的信息是决不会丢失的。丢失的。2 2.稳定存储器稳定存储器的实现的实现p数据备份数据备份 p数据银行数据银行 8.2.1 8.2.1 存储器结构存储器结构(2)(2)3.数据数据访问p块、物理块和缓冲块、物理块和缓冲块块p块块的操作的操作inputinput(A A):把把物物理理块A A的的内内容容传送送到到内内存存的的缓冲冲块中。中。OutputOutput(B B):把:把缓冲冲块B B的的内容内容传送到磁送到磁盘中恰当的中恰当的物理物理块中中 B内存内存AB磁盘磁盘input(A)output(B)图图8.2 块操作块操作8.2.1 8.2.1 存储器结构存储器结构(3)(3)xiwrite(X)包含包含x的块的块Bx存在,存在,read(X)事务事务系统系统开开始始请求请求read(X)事务工作区事务工作区分配分配X磁盘缓冲区磁盘缓冲区扫描内存扫描内存磁盘磁盘包含包含x的块的块Bx存在,存在,input(B)8.2.1 8.2.1 存储器结构存储器结构(4)(4)银行转账系统银行转账系统A=2000 B=1000事务事务A=A-100B=B+100output(Aoutput(A)output(Boutput(B)断电或其断电或其断电或其断电或其他故障他故障他故障他故障假假设设没没有有事事务务的的原原子子性性,那那么么重重新新启启动动事事务务时时,要要么么A A因因为为再再执执行行一一遍遍而而为为18001800,要要么么B B因因从从未未执执行行而而保保持原值。持原值。4.恢复和原子性的联系恢复和原子性的联系恢复的基本原则和实现方法恢复的基本原则和实现方法u基本原则基本原则 :“冗余冗余”,即数据库重复存储。,即数据库重复存储。u具体实现方法具体实现方法 平平时做好两件事:做好两件事:转储和建立日志和建立日志周期地(比如一天一次)周期地(比如一天一次)对整个数据整个数据库进行拷行拷贝,转储到另一个磁到另一个磁盘或磁或磁带一一类存存储介介质中。中。建立日志数据建立日志数据库。记录事事务的开始、的开始、结束及数据每一次束及数据每一次插入、插入、删除和修改前后的除和修改前后的值,并写到,并写到“日志日志”库中。中。一旦一旦发生数据生数据库故障,分两种情况故障,分两种情况进行行处理理 如果数据如果数据库已被破坏,已被破坏,则装入装入lastlast数据数据库备份,再利用份,再利用日志日志库将将这两个数据两个数据库状状态之之间的所有更新重新做一遍。的所有更新重新做一遍。如果数据如果数据库未被破坏,但某些数据不可靠,未被破坏,但某些数据不可靠,则撤消所有撤消所有不可靠的修改,把数据不可靠的修改,把数据库恢复到正确的状恢复到正确的状态。8.2.3 8.2.3 故障类型和恢复方法故障类型和恢复方法(1)(1)1.1.事务故障事务故障可以可以预期的事期的事务故障,如存款余故障,如存款余额透支等透支等非非预期事期事务故障,如运算溢出、数据故障,如运算溢出、数据错误、死、死锁等等2.2.系统故障:硬件故障、软件错误或掉电等系统故障:硬件故障、软件错误或掉电等,重重新启动时,具体处理分两种情况考虑。新启动时,具体处理分两种情况考虑。对未完成事未完成事务作作UNDOUNDO处理;理;对已提交事已提交事务但更新但更新还留在留在缓冲区的事冲区的事务进行行REDOREDO处理。理。8.2.3 8.2.3 故障类型和恢复方法故障类型和恢复方法(2)(2)3 3介质故障介质故障在在发生生介介质故故障障和和遭遭受受病病毒毒破破坏坏时,磁磁盘上上的的物物理理数数据据库遭遭到到毁灭性性破破坏坏。此此时恢恢复复的的过程如下:程如下:p重重装装最最近近转储的的后后备副副本本到到新新的的磁磁盘,使使数数据据库恢复到恢复到转储时的一致状的一致状态。p在在日志中找出最近日志中找出最近转储以后所有已提交的事以后所有已提交的事务。p对这些些已已提提交交的的事事务进行行REDOREDO处理理,将将数数据据库恢复到故障前某一恢复到故障前某一时刻的一致状刻的一致状态。在在实际中中,系系统故故障障通通常常称称为软故故障障(Soft(Soft Crash)Crash),介介质故故障障通通常常称称为硬硬故故障障(Hard(Hard Crash)Crash)。8.2.4 8.2.4 检查点技术检查点技术(1)(1)1 1检查点方法检查点方法 在在DBSDBS运运行行时,DBMSDBMS定定时设置置检查点点。在在检查点点时刻刻才才真真正正做做到到把把对DBDB的的修修改改写写到到磁磁盘,并并在在日日志志文文件件写写入入一一条条检查点点记录(以以便便恢恢复复时使使用用)。当当DBDB需需要要恢恢复复时,只只有有那那些些在在检查点点后后面的事面的事务需要恢复。需要恢复。事务事务T1T1不必恢复;不必恢复;事务事务T2T2和事务和事务T4T4必须重做必须重做(REDO)(REDO);事务事务T3T3和事务和事务T5T5必须撤消必须撤消(UNDO)(UNDO)。事务事务检查点检查点故障点故障点t检查点检查点T1T1T3T3T2T2T5T5T4T48.2.4 8.2.4 检查点技术检查点技术(2)(2)2 2检查点方法的恢复算法:分成两步。检查点方法的恢复算法:分成两步。(1 1)根根据据日日志志文文件件建建立立事事务重重做做队列列和和事事务撤撤销队列列。此。此时,从,从头扫描日志文件(正向描日志文件(正向扫描)。描)。(2 2)对重重做做队列列中中的的事事务进行行REDOREDO处理理,对撤撤销队列列中的事中的事务进行行UNDOUNDO处理。理。p进进行行REDOREDO处处理理的的方方法法是是:正正向向扫扫描描日日志志文文件件,根根据据重重做做队队列列的的记记录录对对每每一一个个重重做做事事务务重重新新实实施施对对数数据库的更新操作。据库的更新操作。p进进行行UNDOUNDO处处理理的的方方法法是是:反反向向扫扫描描日日志志文文件件,根根据据撤撤销销队队列列的的记记录录对对每每一一个个撤撤销销事事务务的的更更新新操操作作执执行逆操作。行逆操作。8.2.5 SQL8.2.5 SQL对事务的支持对事务的支持无无begin transactionCommitRollback8.3 数据数据库库的并的并发发控制控制8.3.1 8.3.1 并发操作带来的三个问题并发操作带来的三个问题8.3.2 8.3.2 封锁技术封锁技术8.3.3 8.3.3 封锁带来的问题封锁带来的问题8.3.4 8.3.4 并发操作的调度并发操作的调度8.3.5 SQL8.3.5 SQL对事务处理的支持对事务处理的支持并发操作带来的三个问题并发操作带来的三个问题(1)(1)图图8.5 8.5 在时间在时间t8t8丢失了事务丢失了事务T1T1的更新的更新(FINDFIND表示从表示从DBDB中读值,中读值,UPDUPD表示把值写回到表示把值写回到DBDB)1 1丢失更新问题(例丢失更新问题(例8.28.2)时间 更新事务T1数据库中A的值更新事务T2t0100t1FINDAt2FINDAt3A:=A-30t4A:=A*2t5UPDAt680UPDAt8200并发操作带来的三个问题并发操作带来的三个问题(2)(2)图图8.6 8.6 事务事务T2T2在时间在时间t4t4读了未提交的读了未提交的A A值(值(8080)2 2读脏数据问题(例读脏数据问题(例8.38.3,用户读了,用户读了“脏数据脏数据”,但没有破坏数据库的完整性)但没有破坏数据库的完整性)时间更新事务T1 数据库中A的值 读事务T2t0100t1FINDAt2A:=A-30t3UPDAt480FINDAt5*ROLLBACK*t6100并发操作带来的三个问题并发操作带来的三个问题(3)(3)图图8.8 8.8 事务事务T2T2在时间在时间t4t4读了未提交的读了未提交的A A值,并在时间值,并在时间t8t8丢失了自己的更新丢失了自己的更新2 2读脏数据问题(读脏数据问题(例例8.48.4,用用户读户读了了“脏脏数据数据”,引起,引起自自身的更新操作被身的更新操作被丢丢失,破坏了数据失,破坏了数据库库的完整性)的完整性)时间 更新事务T1 数据库中A的值 更新事务T2t0100t1FINDAt2A:=A-30t3UPDAt480FINDAt5A:=A*2t6UPDAt8140t8*ROLLBACK*t9100并发操作带来的三个问题并发操作带来的三个问题(4)(4)图图8.8 8.8 事务事务T1T1两次读取两次读取A A的值,的值,却得到了不同的结果却得到了不同的结果3.3.不可重复读问题不可重复读问题(例(例8.58.5)时间 读事务T1 数据库中A的值 更新事务T2t0100t1FINDAt2XFINDAt3A:=A*2t4UPDAt5200COMMITt6FINDA并发操作带来的三个问题并发操作带来的三个问题(5)(5)时间时间更新事务更新事务T1T1数据库中数据库中A A值值更新事务更新事务T2T2t0t0100100t1t1FIND AFIND At2t2FIND AFIND At3t3A:=A-30A:=A-30t4t4A:=A*2A:=A*2t5t5UPD AUPD At6t68080UPD AUPD At8t8200200图图8.5 8.5 在时间在时间t8t8丢失了事务丢失了事务T1T1的更新的更新解决方法:解决方法:封锁技术封锁技术(1)(1)定定义义8.3 8.3 锁锁(locklock)是是一一个个与与数数据据项项相相关关的的变变量量,对对可可能能应应用用于于该该数数据据项项上上的的操操作作而而言言,锁锁描描述述了了该该数据项的状态。数据项的状态。通通常常在在数数据据库库中中每每个个数数据据项项都都有有一一个个锁锁。锁锁的的作作用用是是使使并并发发事事务务对对数数据据库库中中数数据据项项的的访访问问能能够够同同步。步。封锁技术中主要有两种封锁:封锁技术中主要有两种封锁:排他型封锁排他型封锁 共享型封锁共享型封锁 封锁技术封锁技术(2)(2)1.1.排他型封锁(排他型封锁(X X锁,写锁)锁,写锁)X X锁锁定定义义:如如果果事事务T T对某某个个数数据据R R(可可以以是是数数据据项、记录、数数据据集集乃乃至至整整个个数数据据库)实现了了X X锁,那那么么在在T T对数数据据R R解解除除封封锁之之前前,不不允允许其其他他事事务T T再再对该数数据据加加任任何何类型的型的锁。这种种锁称称为“X X锁”。X X锁的操作有两个的操作有两个:封封锁操操作作 “XFIND XFIND R R”:表表示示事事务对数数据据R申申请加加X锁,若若成成功功,则可可以以读或或写写数数据据R,若若不不成成功功,那那么么这个个事事务将将进入入等等待待队列列,直直到到获得得X锁,事,事务才才继续做下去。做下去。解解锁操操作作 “XRELEASE XRELEASE R R”:表表示示事事务要要解解除除对数数据据R的的X锁 X X锁的的解解除除操操作作应该合合并并到到事事务的的结束束(COMMITCOMMIT或或ROLLBACKROLLBACK)操作中。)操作中。时间更新事务T1DB中A的值更新事务T2t0100t1XFINDAt2XFINDA(失败)wait(等待)t3A:=A-30waitt4waitt5UPDAwaitt680waitt8COMMIT(含解锁)waitt8XFINDA(重做)t9A:=A*2t10UPDAt11140COMMIT(含解锁)封锁技术封锁技术(3)(3)例例8.6 8.6 使用使用X X锁技术,可以解决图锁技术,可以解决图8.58.5的丢失更新问题。的丢失更新问题。图图8.9 8.9 等事务等事务T1T1更新完成后再执行事务更新完成后再执行事务T2T22 2共享型封锁(共享型封锁(S S锁,读锁)锁,读锁)定定义8.5 8.5 如如果果事事务T T对某某数数据据加加上上S S锁后后,仍仍允允许其其他他事事务再再对该数数据据加加S S锁,但但在在对该数数据据的的所所有有S S锁都都解解除除之前决不允之前决不允许任何事任何事务对该数据加数据加X X锁。S S锁的操作有三个:的操作有三个:封锁操作“SFIND R升级和写操作“UPDX R”解锁操作“SRELEASE R”可可以以看看出出,获准准S S锁的的事事务只只能能读数数据据,不不能能更更新新数数据,若要更新,据,若要更新,则先要把先要把S S锁升升级为X X锁。另另外外,由由于于S S锁只只允允许读数数据据,因因此此解解除除S S锁的的操操作作不不必必非非要要合合并并到到事事务的的结束束操操作作中中去去,可可以以随随时根根据据需需要要解除解除S S锁。封锁技术封锁技术(4)(4)时间更新事务T1DB中A的值更新事务T2t0100t1SFINDAt2SFINDAt3A:=A-30t4A:=A*2t5UPDXA(失败)t6waitUPDXA(失败)t8waitwaitt8waitwait 封锁技术封锁技术(5)(5)例例8.8 使用使用S S锁技术锁技术,也可以解决图也可以解决图8.5的丢失更新问题。的丢失更新问题。图图8.10 更新未丢失更新未丢失,但在时间但在时间t6t6发生了死锁发生了死锁注:注:N=NO,不相容的请求,不相容的请求 Y=YES,相容的请求,相容的请求X、S、:、:分别表示分别表示X锁,锁,S锁,无锁锁,无锁 如果两个封锁是不相容如果两个封锁是不相容 的,则后提出封锁的事务的,则后提出封锁的事务 要等待。要等待。XSXNNYSNYYYYYT1T2 封锁技术封锁技术(6)(6)3 3封锁的相容矩阵封锁的相容矩阵4 4封锁的粒度封锁的粒度定定义8.6 封封锁对象的大小称象的大小称为封封锁的粒度的粒度。封封锁的的对象象 逻辑单元元:属性属性值值、属性、属性值值集合、元集合、元组组、关系、关系、索引、索引项项、整、整个索引、整个数据个索引、整个数据库库 物理物理单元元:页(数据(数据页或索引或索引页)、)、块 封封锁粒粒度度与与系系统并并发度度和和并并发控控制制开开销密密切切相相关关。粒粒度度越越大大,系系统中中能能被被封封锁的的对象象就就越越少少,并并发度度就就越越小小,但但同同时系系统的的开开销也也就就越越小小;相相反反,粒粒度度越越小小,并并发度越高,系度越高,系统开开销越大。越大。选择封封锁粒粒度度时必必须同同时考考虑封封锁机机构构与与并并发度度两两个因素,个因素,对系系统开开销与并与并发度度进行行权衡。衡。封锁技术封锁技术(8)(8)5 5封封锁锁协协议议:三三级封封锁协议,分分别在在不不同同程程度度上上解解决决了了并并发操操作作带来来的的各各种种问题,为并并发操操作作的的正正确确调度提供一定的保度提供一定的保证。封锁技术封锁技术(8)(8)表8.1封锁协议的内容和优缺点级别内容优点缺点一级封锁协议事务在修改数据之前,必须先对该数据加X锁,直到事务结束时才释放但只读数据的事务可以不加锁防止“丢失修改”不加锁的事务,可能“读脏数据”,也可能“不可重复读”二级封锁协议但其他事务在读数据之前必需先加S锁读 完 数 据后 即 可 释放S锁防止“丢失修改”,防止“读脏数据”对加S锁的事务,可能“不可重复读”三级封锁协议直 到 事 务结 束 时 才释放S锁防止“丢失修改”,防止“读脏数据”,防止“不可重复读”8.3 数据数据库库的并的并发发控制控制8.3.1 8.3.1 并发操作带来的三个问题并发操作带来的三个问题8.3.2 8.3.2 封锁技术封锁技术8.3.3 8.3.3 封锁带来的问题封锁带来的问题8.3.4 8.3.4 并发操作的调度并发操作的调度8.3.5 SQL8.3.5 SQL对事务处理的支持对事务处理的支持 封锁带来的问题封锁带来的问题(1)(1)1 1“活锁活锁”问题问题定定义义8.8 8.8 系系统统可可能能使使某某个个事事务务永永远远处处于于等等待待状状态态,得得不不到到封封锁锁的的机机会会,这这种种现现象象称称为为“活活锁锁”(Live Live LockLock)。)。解解决决活活锁锁问问题题的的一一种种简简单单的的方方法法是是采采用用“先先来来先先服务服务”的策略,也就是简单的排队方式。的策略,也就是简单的排队方式。如如果果运运行行时时,事事务务有有优优先先级级,那那么么很很可可能能使使优优先先级级低低的的事事务务,既既使使排排队队也也很很难难轮轮上上封封锁锁的的机机会会。此此时时可可采采用用“升升级级”方方法法来来解解决决,也也就就是是当当一一个个事事务务等等待待若若干干时时间间(譬譬如如5 5分分钟钟)还还轮轮不不上上封封锁锁时时,可可以以提提高高其其优先级别,这样总能轮上封锁。优先级别,这样总能轮上封锁。封锁带来的问题封锁带来的问题(2)(2)2 2“饿死饿死”问题问题定定义义8.8 8.8 有有可可能能存存在在一一个个事事务务序序列列,其其中中每每个个事事务务都都申申请请对对某某数数据据项项加加S S锁锁,且且每每个个事事务务在在授授权权加加锁锁后后一一小小段段时时内内释释放放封封锁锁,此此时时若若另另有有一一个个事事务务T2T2欲欲在在该该数数据据项项上上加加X X锁锁,则则将将永永远远轮轮不不上上封封锁锁的的机机会会。这这种现象称为种现象称为“饿死饿死”(starvationstarvation)。)。可可以以用用下下列列方方式式授授权权加加锁锁来来避避免免事事务务饿饿死死。当当事务事务T2T2中请对数据项中请对数据项Q Q加加S S锁时,授权加锁的条件是:锁时,授权加锁的条件是:不存在在数据项不存在在数据项Q Q上持有上持有X X锁的其他事务;锁的其他事务;不不存存在在等等待待对对数数据据项项Q Q加加锁锁且且先先于于T2T2申申请请加加锁锁的的事务。事务。封锁带来的问题封锁带来的问题(3)(3)3.“3.“死锁死锁”问题问题定定义义8.9 8.9 系系统统中中有有两两个个或或两两个个以以上上的的事事务务都都处处于于等等待待状状态态,并并且且每每个个事事务务都都在在等等待待其其中中另另一一个个事事务务解解除除封封锁锁,它它才才能能继继续续执执行行下下去去,结结果果造造成成任任何何一一个个事事务务都都无无法法继继续续执执行行,这这种种现现象象称称系系统统进进入入了了“死死锁锁”(Dead LockDead Lock)状态。)状态。时间事务T1事务T2t0 XFINDAt1XFINDBt2 XFINDBt3waitXFINDAt4waitwait图图8.12 8.12 在时间在时间t4t4两个事务发生死锁两个事务发生死锁 封锁带来的问题封锁带来的问题(4)(4)u我我们们可可以以用用事事务务依依赖赖图图的的形形式式测测试试系系统统中中是是否否存存在在死死锁锁。图图中中每每一一个个结结点点是是“事事务务”,箭箭头头表表示示事事务务间间的的依依赖赖关系。关系。图图8.148.14为为无无环环依依赖赖图图,表表示示系统未进入死锁状态;系统未进入死锁状态;而而图图8.158.15为为有有环环依依赖赖图图,则则表示系统进入死锁状态。表示系统进入死锁状态。数据数据B B数据数据A A 封锁带来的问题封锁带来的问题(5)(5)uDBMSDBMS中中有有一一个个死死锁锁测测试试程程序序,每每隔隔一一段段时时间间检检查查并发的事务之间是否发生死锁。并发的事务之间是否发生死锁。u如如果果发发生生死死锁锁,那那么么只只能能抽抽取取某某个个事事务务作作为为牺牺牲牲品品,把把它它撤撤消消,做做回回退退操操作作,解解除除它它的的所所有有封封锁锁,恢恢复复到到该该事事务务的的初初始始状状态态。释释放放出出来来的的资资源源就就可可以以分分配配给给其其他他事事务务,使使其其他他事事务务有有可可能能继继续续运运行行下下去去,就有可能消除死锁现象。就有可能消除死锁现象。u理理论论上上,系系统统进进入入死死锁锁状状态态时时可可能能会会有有许许多多事事务务在在相相互互等等待待,但但是是System System R R的的实实验验表表明明,实实际际上上绝绝大大部部分分的的死死锁锁只只涉涉及及到到两两个个事事务务,也也就就是是事事务务依依赖赖图图中中的的循循环环里里只只有有两两个个事事务务。有有时时,死死锁锁也也被被形形象象地称作地称作“死死拥抱死死拥抱”(Deadly EmbraceDeadly Embrace)。)。8.3 数据数据库库的并的并发发控制控制8.3.1 8.3.1 并发操作带来的三个问题并发操作带来的三个问题8.3.2 8.3.2 封锁技术封锁技术8.3.3 8.3.3 封锁带来的问题封锁带来的问题8.3.4 8.3.4 并发操作的调度并发操作的调度8.3.5 SQL8.3.5 SQL对事务处理的支持对事务处理的支持事事务的的调度:事度:事务的的执行次序称行次序称为“调度度”。串串行行调调度度:如如果果多多个个事事务务依依次次执执行行,则则称称为为事事务务的串行调度(的串行调度(Serial ScheduleSerial Schedule)。)。并并发发调调度度:如如果果利利用用分分时时的的方方法法,同同时时处处理理多多个个事事务务,则则 称称 为为 事事 务务 的的 并并 发发 调调 度度(Concurrent Concurrent ScheduleSchedule)。)。可可串串行行化化:如如果果一一个个并并发调度度的的执行行结果果与与某某一一串串行行调度度的的执行行结果果等等价价,那那么么这个个并并发调度度称称为“可可串串行行化化的的调度度”,否否则是是“不不可可串串行化的行化的调度度”。8.3.4 并并发发操作的操作的调调度度1 1事事务的存取模式的存取模式READ ONLY(只(只读型):事型):事务对数据数据库的操的操作只能是作只能是读操作。操作。READ WRITE(读写型):事写型):事务对数据数据库的的操作可以是操作可以是读操作,也可以是写操作。操作,也可以是写操作。这两种模式可用下列两种模式可用下列SQL语句定句定义:SET TRANSACTION READ ONLY SET TRANSACTION READ WRITE 8.3.5 SQLSQL对并发处理的支持对并发处理的支持(1)(1)8.3.5 SQLSQL对并发处理的支持对并发处理的支持(2)(2)2 2事事务的隔离的隔离级别SERIALIZABLESERIALIZABLE(可串行化):允(可串行化):允许事事务并并发执行,但行,但须保保证并并发调度可串行化,是默度可串行化,是默认级别。REPEATABLE READREPEATABLE READ(可重复(可重复读):只):只许事事务读已提交的数据,已提交的数据,且两次且两次读之之间不不许其他事其他事务修改此数据。修改此数据。READ COMMITTEDREAD COMMITTED(读提交数据):允提交数据):允许事事务读已提交的数已提交的数据,但不要求据,但不要求“可重复可重复读”。READ UNCOMMITTEDREAD UNCOMMITTED(可以(可以读未提交数据):允未提交数据):允许事事务读已已提交或未提交的数据。提交或未提交的数据。上述四种上述四种级别级别可以用下列可以用下列SQLSQL语语句定句定义义:SET TRANSACTION ISOLATION LEVELSET TRANSACTION ISOLATION LEVEL SERIALIZABLE SERIALIZABLESET TRANSACTION ISOLATION LEVEL SET TRANSACTION ISOLATION LEVEL REPEATABLE READREPEATABLE READSET TRANSACTION ISOLATION LEVEL SET TRANSACTION ISOLATION LEVEL READ COMMITTEDREAD COMMITTEDSET TRANSACTION ISOLATION LEVEL SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDREAD UNCOMMITTED第第8章章 系统实现技术系统实现技术8.1 事务8.2 数据库的恢复8.3 数据库的并发控制