求教大神指点 一致读和当前读

a12939026 2015-01-10 09:43:11
最近在看TOM的oracle编程艺术这本书。
看到关于oracle写一致性的实现是在查的时候先一致读,然后更新的时候再用当前读来比较是否数据有过更改。
我有个问题不明白,既然这样为什么不一开始就使用当前读,还有后面在使用当前读的时候,数据不会被别的session更改么? 是否可能有这种情况发生呢?
...全文
240 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
bw555 2015-01-12
  • 打赏
  • 举报
回复
当前读是在正式UPDATE的时候发生的,这个没错 举个例子说吧, 如果有3个进程读取数据,不一定那个进程需要修改数据 如果在起始读取时就使用当前读,则数据直接被第一个读取数据的进程锁定, 其他两个进程是无论如何也没法update的,这样很容易造成死锁。 而开始使用一致读,则哪个进程最早提出update申请,由哪个进程进行当前读对数据进行锁定 这样更灵活、方便,且不易发生死锁
a12939026 2015-01-12
  • 打赏
  • 举报
回复
引用 3 楼 bw555 的回复:
一开始就当前读,那样的话只要这个进程不提交,其他进程都无法进行更新,很容易发生死锁的
是这个理由么? 我的理解是当前读是在正式UPDATE的时候发生的,而不是再COMMIT的时候发生的呀。 要是和提交相关,就算是后面在当前读,也同样会阻塞别的进程啊。
a12939026 2015-01-11
  • 打赏
  • 举报
回复
引用 1 楼 bw555 的回复:
进行当前读的时候会试图对记录进行加锁,如果别的进程正在修改,则此记录已经被加锁,这时候当前进程的锁是加不上的 数据保存过程是先加锁,然后判断读写之间是否已经更改,如果已经更改则提示不能提交
那么为什么还要先进行一致读呢。 反正最后都要当前读,开始就直接当前读不就好了么。
bw555 2015-01-11
  • 打赏
  • 举报
回复
进行当前读的时候会试图对记录进行加锁,如果别的进程正在修改,则此记录已经被加锁,这时候当前进程的锁是加不上的 数据保存过程是先加锁,然后判断读写之间是否已经更改,如果已经更改则提示不能提交
bw555 2015-01-11
  • 打赏
  • 举报
回复
一开始就当前读,那样的话只要这个进程不提交,其他进程都无法进行更新,很容易发生死锁的

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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