系统实现技术Word文件下载.docx

上传人:b****6 文档编号:21762593 上传时间:2023-02-01 格式:DOCX 页数:34 大小:46.91KB
下载 相关 举报
系统实现技术Word文件下载.docx_第1页
第1页 / 共34页
系统实现技术Word文件下载.docx_第2页
第2页 / 共34页
系统实现技术Word文件下载.docx_第3页
第3页 / 共34页
系统实现技术Word文件下载.docx_第4页
第4页 / 共34页
系统实现技术Word文件下载.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

系统实现技术Word文件下载.docx

《系统实现技术Word文件下载.docx》由会员分享,可在线阅读,更多相关《系统实现技术Word文件下载.docx(34页珍藏版)》请在冰豆网上搜索。

系统实现技术Word文件下载.docx

从A帐号——>

B帐号转10000元,既可定义一个事务。

A-10000

B+10000

3.隔离性(isolation)

一个事务的执行不能被其他事务打扰,在并发事务操作时,系统应保证与这些事务独执行时结果一样。

4.持久性(durability)

一个事务一旦完成全部操作后,它对DB的所有更新应永久反映在DB中。

即使以后系统发现故障,也应保留这个事务的结果。

上述四个性质分别有DBMS相应的子系统实现。

A:

由DBMS的事务管理子系统实现。

C:

由DBMS测试完整性约束自动完成。

I:

由DBMS的并发控制子系统实现。

D:

由DBMS恢复控制子系统实现。

对DB的访问是建立在读,写两个操作的基础上的

.read(x):

把数据X从DB读到内存缓冲区

.write(x):

把数据X从内存缓冲区写回DB

(在实际操作时,write(x)未必就写回DB很可能先暂存在系统缓冲区,然后再写回硬盘。

先假定write(x)写回磁盘。

举例说明事务的ACID性质:

例:

银行DB有转帐事务Ti,从帐号A转50元到帐号B

Ti:

read(A)

A:

=A-50

Write(A)

Read(B)

B=B+50

Write(B)

(1)原子性:

由事务的原子性保持事务的一致性,但事务的执行有一定的时间,在某一个时刻会不一致,是正常的

(2)一致性:

A-50,B+50A+B的和不变

(3)隔离性:

在A-50后,突然插入一个事务来计算A+B,那肯定会不对,这就要由DBMS的并发控制来控制。

(4)持久性:

事务正确执行后,仍长期保存,不能丢失

7.1.3事务的状态变迁

read/write

beginendcommit

transactiontransaction

abort

rollback

1、活动状态:

事务开始执行,即进入“活动”状态,在活动状态执行对DB进行读/写,但“写”并不立即写到硬盘,可暂存在系统缓冲区。

2、提交

事务执行完后,进入该状态,但对DB的修改很可能在缓冲区内,所以事务并未真正结束。

3、失败

两种没有运行到事务的最后一个语句就中止

事务的修改未写到硬盘

4、异常中止

在“失败”状态的事务,很可能对硬盘的数据进行了一部分修改,为了保证事务的原子性,应撤消undo,执行rollback回退到事务执行前的状态。

恢复子系统完成

在异常中止时:

重新启动事务:

由硬件等原因造成。

取消事务:

由事务内逻辑错误。

5、提交

在局部提交后,并发控制系统将检查该事务与并发事务是否发生干扰,通过检查后,系统执行commit。

把对DB的修改的全部写到硬盘,成功结束。

事务结束有两个状态:

commit

7.1.4事务的并发执行

为了提高事务的执行效率,使多个事务并发执行。

事务的执行次序称为“调度”。

如果多个事务依次执行,则称为事务的串行调度。

如果利用分时的方法同时处理多个事务,则称为事务的并发调度。

举例说明事务的并发执行,可能会带来DB的不一致性。

设事务T1从帐号A转100元到帐号B

T2从帐号A转10%的款到帐号B

T1:

read(A)T2:

read(A)

=A-100temp:

=A*0.1

Write(B)A:

=A-temp

Read(B)write(A)

B:

=B+100read(B)

Write(B)B:

=B+temp

Write(B)

设A.B的初值为2000,1000

第一种S1:

串行:

T1

T2

T1

Read(A)

=A-100

B:

=B+100

Temp:

 

A=1710B=1290

第二种S2:

W(A)

R(B)

W(B)

R(A)

A=1700B=1300

第三种S3:

并发调度:

r(A)

Temp=A*0.1

w(A)

r(B)

第四种S4:

并发

A=1900B=1200

如果有n个事务,串行调度有n!

中不同的有效调度(都正确)并行调度有远远>n!

种调度,且有的并发调度是正确的(和串行调度之一相等即可)。

如何产生一个正确的并发调度,由DB的并发控制系统实现。

作业:

课后习题:

12

7.1.5并发事务的可串行化

从上例可以看出,有的并发调度可以保持DB的一致,有的则不行,涉及到一个概念——并发事务的可串行化。

下面讨论两种不同形式的等阶调度:

冲突可串行化

观察可串行化

1.冲突可串行化

设有两个事务Ti,Tj,其调度为S。

S中有两个相邻语句Ii和Ij(指read,write)分别来自Ti,Tj

第一:

如果Ii和Ij是对不同数据的操作,那么交换Ii和Ij次序,不影响调度执行的结果。

第二:

如果Ii和Ij是对同一数据的操作,则

(1)Ii=r(Q)Ij=r(Q)可忽视Ii.Ij的先后次序即:

可互换

(2)Ii=r(Q)Ij=w(Q)Ii.Ij互换后.Ii读Q可能就不一样即:

不能互换

(3)Ii=w(Q)Ij=r(Q)不能互换(同上)

(4)Ii=w(Q)Ij=w(Q)其次序直接影响DB中的值即:

Ii和Ij是并发事务Ti和Tj中的read、write语句,并在并发调度中相邻。

当Ii和Ij是对同一数据操作时,并且至少有一个write语句,我们称Ii.Ij是一对“冲突”语句,否则,为“非冲突”语句。

在调度S中,有一对相邻的语句是“非冲突”的,那么它次序可互换,且交换后产生的新调度S’和S等价,即产生相同的执行结果。

上例上的第三种情况S3(简化只留下r、w语句)

T2

R(A)

W(A)

R(A)

R(B)

W(B)

T1

同第一种,所以第三种S3和第一种S1是等价的。

如果调度S’从调度S通过交换一系列的非冲突语句得到,那么称S、S’是一对“冲突等价”的调度。

如果调度S某个串行调度是“冲突等价”,那么称调度S是“冲突可串行化”的调度。

第一种S1和第二种S2是“冲突等价等价”吗?

即:

T2的r(A)不可能换到T1的w(A)之前,所以两种情不一样。

有一并发调度T3、T4是“冲突可串行化”吗?

T3

T4

R(Q)

W(Q)

两邻语句不能互换即不能变为T3T4

T4T3

所以不是“冲突可串行化”

有一并发调度

从帐号A转100到帐号B

T5:

从帐号B转10到帐号A

设:

A=2000B=1000

T5

=B-10

=A+10

A=1910B=1090A=1910B=1090

这两种“调度”等价,但不是“冲突可串行化”

可见:

“冲突等价”的定义比“调度等价”的定义严格。

“冲突等价”一定是“调度等价”。

而“调度等价”不一定是“冲突等价”。

2、观察可串行化

比“冲突等价”的定义放宽一些。

定义在同样事务集上的两个调度设S、S’,如果满足下列三个条件,那么称S、S’是“观察等价”的调度。

(1)对每个数据项Q,如果事务Ti在调度S中读了Q的初值,那么事务Ti在调度S’也读Q的初值。

(2)对每个数据Q,如果在调度S中,事务Ti执行read(Q)操作,读了由事务Tj产生的Q值,那么在调度S`中,事务Ti也必须执行read(Q)操作,读由事务Tj产生的Q值。

(3)对每个数据项Q,如果在调度S中,最后执行W(Q)的事务是Ti,那么在S`中最后执行W(Q)也是Ti。

(1)

(2)可以保证在调度中每个事务读到同样的数据值,

(1)

(2)(3)可以导致DB的状态是一样的。

S1S2

S3

在S1中:

T1读A的初始,S2中T1不读A的初始。

所以S1,S2不是观察等价。

S1和S3比较。

(1)T1读A的初始值(S1,S3中)

B的初始值(S1,S3中)

(2)S1中,T2读由T1产生的A,B值。

S3中,T2读由T1产生的A,B值。

(3)S1中,最后执行W(A)、W(B)是T2。

S3中,最后执行W(A)、W(B)是T2。

所以S1和S3是“观察等价”。

如果调度S与某个串引调度是“观察等价”,那么称调度S是“观察可串行化”的调度。

S3为:

观察可串行化,也是“冲突可串行化。

T3

T4

T6

R(Q)

W(Q)

TK

S1是“观察可串行化”但S1不是“冲突可串行化”。

结论:

每个“冲突可串行化”的调度都是“观察可串行化”,但“观察可串行化”的调度不一都是“冲突可串行化”。

7.1.6并发事务的可恢复性

事务可能由于某种原因引起中止。

在事务并发执行时,当事务Ti中止执行时,还会引起依赖于Ti的事务Tj(即是Tj读了Ti写的数据)也必须中止。

故:

调度应满足“可恢复”和“无串接”。

1.可恢复调度

T7

T8

COMMIT

ROllBOOK

事务T7中止,但T8读了T7修改的数据A,引用了“未提交的数据”。

在调度中,如果存在某个事务Ti读了其他事务未提交的数据,随后事务Ti执行了commit,这种调度称为:

“不可恢复”的调度。

“可恢复调度”-------在调度中每一对事务Ti,Tj必满足:

如果事务Tj读了Ti写的数据值,那么Tj的commit必须满足Ti的commit之后。

2、无串接的回退调度

T9

T10

T11

如果T9中止(rollback),则T10,T11也必须回退(rollback)。

在一事务失败时,要引起一系列事务执行回退工作,这种回退称为“串接回退”。

“无连接后退”------对并发调度中每一对事务Ti、Tj都必须满足:

如果事务Tj读了事务Ti写的数据值,那么Ti的commit必须在Tj的读操作之前。

“可恢复”不是“无串接”

Commit

“可恢复”“无串接”

万一T1出错,不会使T1,T2,T3白白浪费执行;

且增加了系统的复杂度,因为T2,T3也要回退。

课后习题1213

(1)

(2)(3)

7.2数据库的并发控制

本节是本章的一个重要内容,是DB的一个实现技术,使学生举报DB,如果实现并发控制。

1、X,S锁。

封锁协议。

时标顺序协议。

●教学方法:

讲授,例子。

7.2.1DB的并发操作带来的问题

1.丢失更新的问题。

S1

A的初值=16

16

A:

=A-2

14

=A-1

15

事务T1对数据A的更新丢失,被T2覆盖。

2.不一致分析的问题(读了过时的数据)S2

A=50B=100

A=50

B=100

C:

=A+B

C=150

B:

=B*2

B=200

D:

D=250

T1要验算,A+B的值是否一致。

D=C?

T2读的是过时的数据。

3.依赖于未提交更新的问题。

(读“脏”数据)S3

C=100

R(C)

=C*2

C=200

W(C)

Rollback

T2读到了“脏”数据。

这些问题需要用并发控制来完成,

封锁协议技术

时标协议技术

乐观方法

7.2.2封锁(locking)

封锁是并发控制的一个非常重要的技术。

基本封锁有两种类型:

排它锁(exclusivelocks,简称X锁,又称写锁)和共享型锁(sharelocks,简称S锁,又称读锁)。

X锁:

如果事务T对某个数据(数据项、记录……DB)实现X封锁,那么其他事务要等T解除X封锁之后,才能对这个数据进行封锁。

S锁:

如果事务Ti对某数据有一个S封锁,那么其他事物Tj也能对这个数据实现S封锁。

但不能对其实现X封锁。

TiTj

X

S

N

Y

7.2.3封锁协议

运用X和S锁,对数据加锁时,还要约定一些规则(如:

何时申请、持续时间、何时释放),这些规则称为封锁协议。

1、一级封锁协议

事务T在修改数据R之前必须先对其加X锁。

直到事务结束才释放。

或:

任何企图更新记录R的事务必须先执行:

“Lock-x(R)”操作可获取对该记录进行寻址的能力,并对它获取x封锁,如果未获取X封锁,那么这个事务进入等待状态,一直到获取X锁,事务才继续它。

对丢失问题的解决T1:

对A-2

T2:

对A-1

更新事务S1

LOCK—X(A)

WAIT

UNLOCK(A)

13

对于修改,删除操作,一级封锁协议适用。

对于插入操作,可以假定“INSERTR”本身就加了X锁。

一级封锁协议可以保证避免丢失更新,但不能避免可重复读和不读“脏”数。

因为仅仅读,不修改是不用加锁的。

S2还会出现不可重复读,S3还会出现读“脏”数。

2、二级封锁协议

一级封锁协议加上事务T在读数据R之前必须先对其加S锁,读完后即释放S锁。

XLOCKC

SLOCKC

UNLOCKC

COMMIT

这就保证了事务不读“脏”数,但由于读完就释放锁,所以S3不能保证可重复读。

3、三级封锁协议

一级封锁协议加上事务T在读数据R之前必须先对其加S锁,直到事务结束才释放。

S2

XLOCKA

SLOCKB

XLOCKB

WAIT

D=150

UNLOCKA

UNLOCKB

100

三级封锁协议的实施,避免了本节开头提到的三类问题,即避免了丢失更新、读“脏”数和不可重复读。

P269表不同级别的封锁协议。

7.2.4活锁和死锁

1、活锁

T1,T2,T3…Tn个事务都要对A进行更新操作,假设T1先获取LOCK-X(A),待其执行UNLOCK(A)后T3获取LOCK-X(A)…使T2一直长期的处于等待状态,这种状态称为“活锁”

LOCK-X(A)

LOCK-X(A)

UNLOCK-X

LOCK–X(A)

活锁的预防,采取先来先服务的策略。

2.死锁

事务T1,T2都要对A,B进行更新操作,T1等待A的X锁T2等待B的X锁,每个事务都在等待对方事务解封锁,这种现象“死锁”。

LOCK-X(B)

3、死锁的预防

●一次封锁法:

要求每个事务必须一次把所使用的数据全部加锁,否则就不执行。

存在的问题:

扩大了封锁的范围,降低了系统的并发度;

数据库的数据是动态的,原本不要求封锁的数据在执行过程中,会变成

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 英语考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1