北大 chap08事务_第1页
北大 chap08事务_第2页
北大 chap08事务_第3页
北大 chap08事务_第4页
北大 chap08事务_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、银行转帐:事务T从A帐户过户50¥到B帐户readread(A);A := A 50;writewrite(A);readread(B);B := B + 50;writewrite(B);readread(X):从数据库传送数据项X到事务的工作区中writewrite(X):从事务的工作区中将数据项X写回数据库n事务是由一系列操作序列构成的程序执行单元,这些操作要么都做,要么都不做,是一个不可分割的工作单位n事务以Begin transaction开始,以Commit transaction或 Rollback transaction结束Commit transaction表示提交,事务正常

2、结束Rollback transaction表示事务非正常结束,撤消事务已做的操作,回滚到事务开始时状态n原子性原子性(Atomicity)事务中包含的所有操作要么全做,要么全不做原子性由恢复机制恢复机制实现n一致性一致性(Consistency)事务的隔离执行必须保证数据库的一致性事务开始前,数据库处于一致性的状态;事务结束后,数据库必须仍处于一致性状态数据库的一致性状态由用户用户来负责如银行转帐,转帐前后两个帐户金额之和应保持不变(意大利香肠术, Salami technique )n隔离性隔离性(Isolation)系统必须保证事务不受其它并发执行事务的影响对任何一对事务T1,T2,在T

3、1看来,T2要么在T1开始之前已经结束,要么在T1完成之后再开始执行隔离性通过并发控制机制并发控制机制实现n持久性持久性(Durability)一个事务一旦提交之后,它对数据库的影响必须是永久的系统发生故障不能改变事务的持久性持久性通过恢复机制恢复机制实现活动状态活动状态失败状态失败状态部分部分提交状态提交状态提交状态提交状态中止状态中止状态初始状态初始状态事务无法继事务无法继续正常执行续正常执行事务回滚,数据库恢事务回滚,数据库恢复到事务开始前状态复到事务开始前状态最后一条语最后一条语句被执行后句被执行后成功完成,永成功完成,永久写入数据库久写入数据库以BEGIN TRANSACTION开始

4、,以COMMIT或ROLLBACK结束事务自动开始,直到遇到COMMIT或ROLLBACK时结束每个数据操作语句作为一个事务update SC set GRADE = GRADE+15set implicit_transactions ON | OFF Begin tranUpdate SCSet grade =grade+5 Update SCSet grade =grade+20Commit tranSelect * from SCBegin tranUpdate SCSet grade =grade+5 Update SCSet grade =grade+20If error0rollb

5、acktranSelect * from SCCommit tran是一种多对多的关系,即一个事务中可以包含多个批,一个批中也可以包含多个事务set XACT_ABORT ON n包含了所有事务的操作指令n一个事务中指令的顺序必须保持不变n在串行调度中,属于同一事务的指令紧挨在一起n对于有n个事务的事务组,可以有n!个有效调度n在并行调度中,来自不同事务的指令可以交叉执行n当并行调度等价于某个串行调度时,则称它是正确的n并行事务会破坏数据库的一致性n串行事务效率低n一个事务由不同的步骤组成,所涉及的系统资源也不同。这些步骤可以并发执行,以提高系统的吞吐量吞吐量n系统中存在着周期不等的各种事务,

6、串行会导致难于预测的时延。如果各个事务所涉及的是数据库的不同部分,采用并发会减少平均响应时间平均响应时间T1read(A);A := A 50;write(A);read(B);B := B + 50;write(B);T2 read(A);temp := A0.1A := A temp;write(A); read(B);B := B + temp;write(B);从A过户50¥到B从A过户存款的10%到B开始状态:A=1000¥B=2000¥A+B=3000¥ read(A); A := A 50; write(A); read(B); B := B + 50; write(B); re

7、ad(A); temp := A0.1 A := A temp; write(A); read(B); B := B + temp; write(B);T1T2A=950¥B=2050¥结束状态:A=855¥B=2145¥A+B=3000¥串串行行调调度度1 1 read(A); A := A 50; write(A); read(B); B := B + 50; write(B); read(A); temp := A0.1 A := A temp; write(A); read(B); B := B + temp; write(B);T1T2A=900¥B=2100¥结束状态:A=850¥

8、B=2150¥A+B=3000¥串串行行调调度度2 2 read(A); A := A 50; write(A); read(B); B := B + temp; write(B);T1T2A=950¥B=2000¥结束状态:A=855¥B=2145¥A+B=3000¥ read(B); B := B + 50; write(B); read(A); temp := A0.1 A := A temp; write(A); A=855¥B=2000¥A=855¥B=2050¥并并行行调调度度3 read(A); A := A 50; write(A); read(B); B := B + tem

9、p; write(B);T1T2A=1000¥B=2000¥结束状态:A=900¥B=2150¥A+B=3050¥ read(B); B := B + 50; write(B); read(A); temp := A0.1 A := A temp; write(A); A=900¥B=2000¥A=900¥B=2050¥并并行行调调度度4A=950¥B=2000¥n事务的恢复事务的恢复:一个事务失败了,应该能够撤消该事务对数据库的影响。如果有其它事务读取了失败事务写入的数据,则该事务也应该撤消read(A);write(A);T1T2read(B);rollback;read(A);commi

10、t不可恢复的调度不可恢复的调度可恢复调度可恢复调度对于每对事务对于每对事务T1T1与与T2T2,如如果果T2T2读取了读取了T1T1所写的数据,所写的数据,则则T1T1必须先于必须先于T2T2提交提交级联调度级联调度由于一个事务故障而由于一个事务故障而导致一系列事务回滚导致一系列事务回滚read(A);read(B);write(A);T1T2read(A)write(A);T3read(A)rollback;无级联调度无级联调度对于每对事务对于每对事务T1T1与与T2T2,如果如果T2T2读取了读取了T1T1所写所写的数据,则的数据,则T1T1必须在必须在T2T2读取之前提交读取之前提交T2

11、T1TimeRead X (10)Read X (10)Compute X -= 1(9Compute X -= 1(9)Write XWrite X两个事务T1和T2读入同一数据并修改,T1提交的结果破坏了T2提交的结果,导致T2的修改丢失T2T1TimeX=10Read X (25)Read X (10)ComputeX+=15(25)X=25Write XX=10Rollback使用了从未提交到数据库中的数据事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤消,这时T1已修改过的数据恢复原值,T2读到的数据与数据库中数据不一致,则T2读到的数据就是脏数据T

12、2T1TimeRead X (10)Read X (10)Compute X+=15(25)X=25Write XCommitRead X (25)X=10事务T2读取某一数据后,事务T1对其做了修改,当T2再次读取该数据时,得到与前次不同的值r1(list) r2(list) w2(list) r2(count) w2(count) commit(t2) r1(count)T2T1TimeSelect count (*) where rank 32 rows returnedSelect count (*) where rank 33 rows returned事务T2按一定条件读取了某些数

13、据后,事务T1插入了一些满足这些条件的数据,当T2再次按相同条件读取数据时,发现多了一些记录selectsum(Balance)fromaccountAwhereA.Name = MaryselectD.TotalBalancefromdepositorDwhereD.Name = Maryinsert into accounts values (Mary,100)update depositorsetTotalBalance =TotalBalance + 100 where Name = Mary nserializable:一个调度的执行必须等价于一个串行调度的结果nrepeatable

14、 read:只允许读取已提交的记录,并要求一个事务对同一记录的两次读取之间,其它事务不能对该记录进行更新nread committed:只允许读取已提交的记录,但不要求可重复读nread uncommitted:允许读取未提交的记录Read uncommitted读脏数据不能重复读幻象Read committedRepeatable readSerializable-不能重复读幻象幻象SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDBEGIN TRAN SELECT SNAME FROM S WHERE SNAME = 王红- 只有一个学生名为王

15、红BEGIN TRAN UPDATE S SET SNAME = 王红SELECT SNAME FROM S WHERE SNAME = 王红- 所有学生姓名均为王红ROLLBACK TRANSELECT SNAME FROM S WHERE SNAME = 王红-只有一个学生名为王红SET TRANSACTION ISOLATION LEVEL READ COMMITTEDBEGIN TRAN BEGIN TRAN UPDATE S SET SNAME = 王红SELECT SNAME FROM S WHERE SNAME = 王红-阻塞,“正在执行批查询”COMMIT TRAN-所有学生姓

16、名均为王红SET TRANSACTION ISOLATION LEVEL READ COMMITTEDBEGIN TRAN SELECT SNAME FROM S WHERE SNAME = 王红- 只有一个学生名为王红BEGIN TRAN UPDATE S SET SNAME = 王红COMMIT TRANSELECT SNAME FROM S WHERE SNAME = 王红-所有学生姓名均为王红SET TRANSACTION ISOLATION LEVEL REPEATABLE READBEGIN TRAN SELECT SNAME FROM S WHERE SNAME = 王%- 只有

17、一个学生名为王红BEGIN TRAN UPDATE S SET SNAME = 王红-阻塞SELECT SNAME FROM S WHERE SNAME = 王红-只有一个学生名为王红SET TRANSACTION ISOLATION LEVEL REPEATABLE READBEGIN TRAN SELECT SNAME FROM S WHERE SNAME = 王%- 只有一个学生,名为王红INSERT INTO S VALUES(s08, 王明, 23, 1)SELECT SNAME FROM S WHERE SNAME = 王%-有两个学生,名为王红和王明SET TRANSACTION

18、 ISOLATION LEVEL SERIALIZABLEBEGIN TRAN SELECT SNAME FROM S WHERE SNAME = 王%- 只有一个学生,名为王红INSERT INTO S VALUES(s08, 王明, 23, 1)-阻塞SELECT SNAME FROM S WHERE SNAME = 王%-只有一个学生,名为王红考虑关系Employee(ID,salary), 表示职工的工资号和工资数额,开始Employee关系中有两个元组(A,20)和(B,30)。现有如下两个事务T1、T2,T1: begin transaction;update Employee s

19、et salary = 2*salary where ID=A;update Employee set salary = salary+10 where ID=A;commit;T2: begin transaction;select sum(salary) as sal1 from Employee;select sum(salary) as sal2 from Employee;commit;给出T2返回的sal1与sal2所有可能的值的情况,如果T2运行的隔离性级别为serializableread committedread uncommitted2212112112221121121

20、12221122221112212211122211211,ttttttttttttttttttttttttT1(只读)T2(更新X)T3(更新Y)T4(更新X, Y)T5(只读)T6(更新Y)读不会阻塞写写不会阻塞读写发生在提交时冲突时先提交者赢一致性要求:A+B = 0当前:AB5r1(x) r1(y) r2(x) r2(y) w1(y) w2(x)T1、T2分别将x、y减去5写偏斜:两个事务写不同的数据项初始值:x=3, y=5T1: x := yT2: y := xcreate database demouse democreate table isolation_1 (id1 int

21、,des varchar(100)insert into isolation_1 values(1, asdf)SI:快照隔离,任何读取操作得到事务开始那一刻最近已经提交过的数据版本,属于事务级快照隔离alter database demoset ALLOW_SNAPSHOT_ISOLATION on(只允许发出上述alter语句的连接存在于该数据库,如果此时还有其他用户使用该数据库,则alter未必被阻塞,但已存在的活动事务会阻塞它。此时新的更新事务可以执行,但快照隔离级别的事务则不可以)连接连接1连接连接2begin tranupdate isolation_1set id = UPDAT

22、EDwhere id1=1begin transelect * from isolation_1(事务起点)commit tran可重复读select * from isolation_1commit tran连接连接1连接连接2SET TRANSACTION ISOLATION LEVEL SNAPSHOTbegin transelect id1 from isolation_1begin tranupdate isolation_1set id1 = id1+10update isolation_1set id1 = id1+20commit tran回滚RCSI:已提交读快照隔离,任何读

23、取操作得到语句开始那一刻最近已经提交过的数据版本,属于语句级快照隔离alter database demo set READ_COMMITTED_SNAPSHOT on(只允许发出上述alter语句的连接存在于该数据库,如果此时还有其他用户使用该数据库,则alter被阻塞)连接连接1连接连接2begin tranupdate isolation_1set des = UPDATEDwhere id1=1begin transelect * from isolation_1commit tran不可重复读select * from isolation_1commit tran连接连接1连接连接2

24、begin transelect id1 from isolation_1begin tranupdate isolation_1set id1 = id1+10update isolation_1set id1 = id1+20(阻塞)commit tran考虑一个调度S中的两条连续指令(仅限于read与 write操作)Ii与Ij,分别属于事务Ti与TjIi = read(Q), Ij = read(Q);Ii = read(Q), Ij = write(Q);Ii = write(Q), Ij = read(Q);Ii = write(Q), Ij = write(Q); 在 情况下,I

25、i与Ij的次序无关紧要。其余情况下,Ii与Ij的次序不同,其执行结果也不同,数据库最终状态也不同当两条指令是不同事务在相同数据项上的操作,并且其中至少有一个是write指令时,则称这两条指令是冲突的如在、情况下,Ii与Ij 是冲突的非冲突指令交换次序不会影响调度的最终结果如果调度S可以经过一系列非冲突指令交换转换成调度S,则称调度S与S是冲突等价的read(A);write(A);read(B);write(B);T1T2read(B); write(B);read(A);write(A);read(A);write(A);read(B);write(B);T1T2write(B);read(

26、A);write(A);read(B);read(A);write(A);read(B);write(B);write(B);read(A);write(A);read(B);123read(A);write(A);read(B);write(B);read(A);write(A);read(B);write(B);当一个调度S与一个串行调度冲突等价时,则称该调度是冲突可串行化的如并行调度3是冲突可串行化的read(A);T1T2write(A);write(A);非冲突串行化的例子:一个调度S的优先图是这样构造的:它是一个有向图G =(V,E),V是顶点集,E是边集。顶点集由所有参与调度的事

27、务组成,边集由满足下述条件之一的边Ti Tj组成:在Tj执行read(Q)之前,Ti执行write(Q)在Tj执行write(Q)之前,Ti执行read(Q)在Tj执行write(Q)之前,Ti执行write(Q)T1T2T1T2read(A);write(B);T1T2write(A);read(B); write(B);read(A);write(A);read(B);T1T2read(A);write(A);read(B);write(B);read(B); write(B);read(A);write(A);n如果优先图中存在边TiTj ,则在任何等价于S的串行调度S中,Ti都必须出现

28、在Tj之前n如果调度S的优先图中有环,则S是非冲突可串行化的。如果图中无环,则S是冲突可串行化的T1T2T1T2并行调度并行调度3 3是冲是冲突可串行化的突可串行化的并行调度并行调度4 4是非是非冲突可串行化的冲突可串行化的n串行顺序可由拓扑排序得到,求出与优先图的偏序相一致的线序T1T3T2T4T1T2T3T4T1T3T2T4read(A);A := A - 50write(A);T1T2冲突指令冲突指令T1T2read(B);B := B - 10write(B);read(B);B := B + 50write(B);read(A);A := A + 10write(A);read(A)

29、;A := A - 50write(A);read(B);B := B + 50write(B);read(B);B := B - 10write(B);read(A);A := A + 10write(A);A=950¥B=2000¥A=950¥B=1990¥A=950¥B=2040¥A=960¥B=2040¥A=960¥B=2040¥A=950¥B=2050¥存在结果相同,但非冲突等价的调度考虑关于某个事务集的两个调度S,S,若调度S,S满足以下条件,则称它们是视图等价的:对于每个数据项Q,若事务Ti在调度S中读取了Q的初始值,那么Ti在调度S中也必须读取Q的初始值对于每个数据项Q,若事务

30、Ti在调度S中执行了read(Q),并且读取的值是由Tj产生的,那么Ti在调度S中读取的Q值也必须是由Tj产生的对于每个数据项Q,若在调度S中有事务执行了最后的write(Q),则在调度S中该事务也必须执行最后的write(Q)注:条件、保证两个调度中的每个事务都读取相同的值,从而进行相同的计算条件保证两个调度得到最终相同的系统状态 read(A);write(A); read(B);write(B);read(A);write(A); read(B);write(B);T1T2read(B);write(B);read(A);write(A); T1T2由由T1T1产生的产生的A A值值 r

31、ead(A);write(A);read(B);write(B);由由T1T1产生的产生的A A值值视图等价n如果某个调度视图等价于一个串行调度,则称该调度是视图可串行化的n冲突可串行化调度一定是视图可串行化的存在视图可串行化但非冲突可串行化的调度read(Q);T1T2write(Q);write(Q);write(Q);T3盲目写操作盲目写操作视图等价read(Q);T1T2write(Q);write(Q);write(Q);T3T1T2T3无用的写操作无用的写操作非冲突可串行化非冲突可串行化设调度S包含了事务T1, T2, , Tn,设Tb, Tf是两个虚事务,其中Tb为S中所有wri

32、te(Q)操作, Tf为S中所有read(Q)操作。在调度S的开头插入Tb ,在调度S的末尾插入Tf,得到一个新的调度S 0删除所有关联无用事务的边。如果在优先图中不存在从Ti到Tf的通路,则Ti是无用事务对于每个数据项Q,如果Tj读取Ti写入的Q值,Tk执行write (Q)操作且TkTb ,则: 0如果Ti = Tb且TjTf,则在带标记的优先图中插入边Tj Tk 0如果TiTb且Tj = Tf,则在带标记的优先图中插入边Tk Ti p p如果TiTb且TjTf,则在带标记的优先图中插入边Tk Ti与Tj Tk 。其中p是一个唯一的,在前面边的标记中未曾用过的大于0的整数read(A);T

33、1T2write(A);write(A);T1TfTbT20000read(Q);T1T2write(Q);write(Q);write(Q);T3T1T2T3Tb0Tf0000read(Q);T1T2write(Q);write(Q);write(Q);T3T1T2T3Tb0Tf0000read(Q);11T1T2T3Tb0Tf00001T1T2T3Tb0Tf00001每个优先图包含标号大于1的边对中的一条判定准则:只要有一个优先图无环,则调度是视图可串行化的时间T1T2T3T41read(A)2write(B)3write(A)4read(B)5read(B)6read(A)7write(

34、C)8write(A)给出该调度的优先图,该调度是冲突可串行化的吗?若是,给出该调度一个的等价的串行调度 No man is an island,Entire of itself.Each is a piece of the continent,A part of the main.If a clod be washed away by the sea,Motherland is the less.As well as if a promontory were.As well as if a manner of thine own Or of thine friends were.Each m

35、ans death diminishes me,For I am involved in mankind.Therefore, send not to knowFor whom the bell tolls,It tolls for theen一层结构BEGIN TRANCOMMITn确定旅行路线n批量更新如银行结算利息,可以把更新每个帐号作为一个事务,也可以把更新所有帐号作为一个事务n当子事务提交时,它的结果只能被它的父事务所访问。只有当一个子事务提交了,并且它的一直到根的所有祖先也都提交了,该子事务才最终提交n如果任何一个嵌套层次的子事务回滚了,它的所有的子事务也都要回滚,不管它们当前是否

36、已经提交。因此,如果根结点回滚,整个嵌套事务也就回滚了n当子事务提交后,它的修改对其父事务是可见的,而对其兄弟是不可见的;父事务的任何对象对其子事务都是可访问的create table TestNestTrans(Col char(3)create proccedure TransProc CharCol char(3)asbegin transaction InProcinsert into TestNestTrans values (CharCol)commit transaction InProcbegin transaction OutOfProcexec TransProc aaar

37、ollback transaction OutOfProcexec TransProc bbbselect * from TestTrans- 最终TestNestTrans表中只有元组bbbselect trancount - trancount = 0begin tran A select trancount - trancount = 1begin tran B select trancount - trancount = 2 rollback tran B - rollback失败select trancount - trancount = 2rollback tran Aselect

38、 trancount - trancount =0select trancount - trancount = 0begin tran A select trancount - trancount = 1begin tran B select trancount - trancount = 2 commit tran B select trancount - trancount = 1commit tran Aselect trancount - trancount =0begin_transaction()S1;sp1 := create_savepoint();Sn;spn := create_savepoint();

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论