系统实现技术Word文件下载.docx
《系统实现技术Word文件下载.docx》由会员分享,可在线阅读,更多相关《系统实现技术Word文件下载.docx(34页珍藏版)》请在冰豆网上搜索。
从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、死锁的预防
●一次封锁法:
要求每个事务必须一次把所使用的数据全部加锁,否则就不执行。
存在的问题:
扩大了封锁的范围,降低了系统的并发度;
数据库的数据是动态的,原本不要求封锁的数据在执行过程中,会变成