社区
基础和管理
帖子详情
怎么证明遵循两段锁协议的事务调度处理的结果是可串行化的?
duboislee
2009-07-03 02:30:01
加精
如题
...全文
5993
33
打赏
收藏
怎么证明遵循两段锁协议的事务调度处理的结果是可串行化的?
如题
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
33 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
commando_s
2010-12-28
打赏
举报
回复
学习了,13楼牛人
flytobest
2010-12-16
打赏
举报
回复
有没有哪位大侠,在写代码时用到了两段锁协议?
oracle_dba_11
2010-09-06
打赏
举报
回复
13楼牛人
wydbyhhds
2010-03-11
打赏
举报
回复
强大啊强大啊
xinbituya
2010-03-05
打赏
举报
回复
貌似书上有,看书不就得了
xiaopangdun2
2009-12-18
打赏
举报
回复
好
zhao_2521
2009-07-15
打赏
举报
回复
深奥!
cab1225
2009-07-07
打赏
举报
回复
可串行化(Serializable) 提供最高级别的事务隔离。 这个级别模拟串行的事务执行, 就好象事务将被一个接着一个那样串行的,而不是并行的执行。 不过,使用这个级别的应用必须准备在串行化失败的时候重新发动事务.
当一个事务处于可串行化级别, 一个 SELECT 查询只能看到在事务开始之前提交的数据而永远看不到未提交的 数据或事务执行中其他并行事务提交的修改。 (不过,SELECT 的确看得到同一次事务中 前面的更新的效果.即使事务还没有提交也一样.) 这个行为和读已提交级别是不太一样的,读已提交看到的是 该事务开始时的快照,而不是该事务内部当前查询开始时的快照.
如果一个正在执行一个 UPDATE 语句(或者 DELETE 或者 SELECT FOR UPDATE 的查询返回的目标行正在被另一个并行的未提交的事务更 新,那么第二个试图更新此行的事务将等待另一个事务的提交或者回卷。 如果发生了回卷,等待中的事务可以继续修改此行。如果发生一个并行的 事务的提交,一个可串行化的事务将回卷,并返回下面信息。
ERROR: Can't serialize access due to concurrent update
因为一个可串行化的事务在 可串行化事务开始之后不能更改被其他事务更改过的行。
当应用收到这样的错误信息时,它应该退出当前的事务然后从头开始重新 进行整个事务.第二次运行时,该事务看到的前一次提交的修改是该数据库 初始的样子中的一部分,所以把新版本的行作为新事务更新的起点不会有 逻辑冲突. 请注意只有更新事务才需要重试 --- 只读事务从来没有串行化冲突.
可串行化事务级别提供了严格的保证:每个事务都看到一个完全完整的数据库 的视图.不过,如果并行更新令数据库不能维持串行执行的样子,那么应用 必须准备重试事务,而且重做复杂的事务的开销可能是非常可观的.所以我们 只建议在更新查询中包含足够复杂的逻辑,在读已提交级别中可能导致错误 的结果的情况下才使用.
snake_gz
2009-07-07
打赏
举报
回复
不错,学习了
moqingcn
2009-07-06
打赏
举报
回复
考博?
inthirties
2009-07-05
打赏
举报
回复
[Quote=引用楼主 duboislee 的帖子:]
如题
[/Quote]
关注.....
jdsnhan
2009-07-05
打赏
举报
回复
太深奥了
fdgdsgfsdgfsg
2009-07-05
打赏
举报
回复
sd哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
csuxp2008
2009-07-05
打赏
举报
回复
不了解,学习中
d104211842
2009-07-05
打赏
举报
回复
学习
feixianxxx
2009-07-05
打赏
举报
回复
试证明,若并发事务遵守两段锁协议,则对这些事务的并发调度是可串行化的。
证明:首先以两个并发事务 Tl 和T2为例,存在多个并发事务的情形可以类推。根据可串行化定义可知,事务不可串行化只可能发生在下列两种情况:
( l )事务 Tl 写某个数据对象 A ,T2读或写 A ;
( 2 )事务 Tl 读或写某个数据对象 A ,T2写 A 。
下面称 A 为潜在冲突对象。
设 Tl 和T2访问的潜在冲突的公共对象为{A1,A2 … , An }。不失一般性,假设这组潜在冲突对象中 X =(A 1 , A2 , … , Ai }均符合情况 1 。 Y ={A i + 1 , … , An }符合所情况( 2 )。
VX ∈ x , Tl 需要 XlockX ①
T2 需要 Slockx 或 Xlockx ②
1 )如果操作 ① 先执行,则 Tl 获得锁,T2等待
由于遵守两段锁协议, Tl 在成功获得 x 和 Y 中全部对象及非潜在冲突对象的锁后,才会释放锁。
这时如果存在 w ∈ x 或 Y ,T2已获得 w 的锁,则出现死锁;否则, Tl 在对 x 、 Y 中对象全部处理完毕后,T2才能执行。这相当于按 Tl 、T2的顺序串行执行,根据可串行化定义, Tl 和几的调度是可串行化的。
2 )操作 ② 先执行的情况与( l )对称因此,若并发事务遵守两段锁协议,在不发生死锁的情况下,对这些事务的并发调度一定是可串行化的
michaelscofielddong
2009-07-05
打赏
举报
回复
事务遵守两段锁协议是可串行化调度的充分条件,不是必要条件。
我看的书上没用具体的证明,只有例子,不好意思 ,支持,学习。
tianwen_e
2009-07-05
打赏
举报
回复
我来转转
liuyi8903
2009-07-05
打赏
举报
回复
翻数据库原理的书
LC399288417
2009-07-05
打赏
举报
回复
来学习
加载更多回复(12)
【
事务
管理】两段封锁协议和冲突可
串行化
如何
证明
遵循
两段锁协议
的
事务
调度
处理
的结果是可
串行化
的 怎么
证明
遵循
两段锁协议
的
事务
调度
处理
的结果是可
串行化
的? 如题 ------解决方案-------------------------------------------------------- 9.4. 可
串行化
隔离级别 可
串行化
(Serializable) 提供最高级别的
事务
隔离。 这个级别模拟串行的
事务
执行, ...
并发
调度
的可串行性:可
串行化
调度
、冲突可
串行化
调度
、
两段锁协议
DBMS对并发
事务
不固的
调度
可能会产生不同的结果,有正确的,有不正确的。显然串行
调度
是正确的。 执行结果等价于串行
调度
的
调度
也是正确的,这样的
调度
叫做可
串行化
调度
。 多个
事务
的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些
事务
时的结果相同,称这种
调度
策略为可
串行化
(Serializable)的
调度
。 并发
事务
正确
调度
的准则。按这个准则规定,一个给定的并发
调度
,当且仅当它是可
串行化
的,才认为是正确的
调度
。 具有什么样性质的
调度
是可
串行化
的调
【数据库】
证明
若并发
事务
遵守
两段锁协议
,则对这些
事务
的并发
调度
是可
串行化
的
DF113
证明
步骤: 1.以两个并发
事务
情况为例
证明
,推导到多个
事务
; 2.列举出两个
事务
发生不可
串行化
时出现的情况; 3.针对2中的两种情况,
证明
若T1和T2遵守
两段锁协议
,在不发生死锁的情况下,则它们的
调度
是可
串行化
的。 ...
事务
并发
调度
的可串行性及
两段锁协议
一、并发
调度
并发
调度
啥意思? 就是当很多
事务
同时执行的时候应该按照什么顺序执行,应该按照排队的顺序执行,这就是 串行
调度
。 串行执行肯定是正确的,但是改变一下位置有影响吗? 这就要看改变顺序之后执行的结果是否和不改变顺序执行的结果一致了。 如果改变顺序之后执行的结果和串行
调度
的执行结果一致,那么就说这种
调度
是 可
串行化
调度
。 可串行性是并发
事务
正确
调度
的准则。 比如:
事务
T1: 读 B A=B+1;写回 A;
事务
T2: 读 A B=A+1;写回 B; 假设 A、B 的初始值都是 2,串行
11.6
两段锁协议
定义
两段锁协议
是一种确保
事务
调度
可
串行化
的方法。分为扩展阶段(申请锁)和收缩阶段(释放锁)。运作机制扩展阶段:
事务
可以申请任何数据项上的任何类型的锁,但不能释放任何锁。收缩阶段:
事务
可以释放任何锁,但不能再申请新的锁。
两段锁协议
的定义与目的:一种确保
事务
调度
可
串行化
的封锁策略,分为锁定阶段和解锁阶段。
两段锁协议
的运作机制:在扩展阶段申请所有必要的锁,在收缩阶段释放所有锁。保障可
串行化
调度
:遵守
两段锁协议
的
事务
调度
是可
串行化
的。
基础和管理
17,377
社区成员
95,128
社区内容
发帖
与我相关
我的任务
基础和管理
Oracle 基础和管理
复制链接
扫一扫
分享
社区描述
Oracle 基础和管理
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章