怎么证明遵循两段锁协议的事务调度处理的结果是可串行化的?

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 )对称因此,若并发事务遵守两段锁协议,在不发生死锁的情况下,对这些事务的并发调度一定是可串行化的
  • 打赏
  • 举报
回复
事务遵守两段锁协议是可串行化调度的充分条件,不是必要条件。
我看的书上没用具体的证明,只有例子,不好意思 ,支持,学习。
tianwen_e 2009-07-05
  • 打赏
  • 举报
回复
我来转转
liuyi8903 2009-07-05
  • 打赏
  • 举报
回复
翻数据库原理的书
LC399288417 2009-07-05
  • 打赏
  • 举报
回复
来学习
加载更多回复(12)

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧