免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2453 | 回复: 8
打印 上一主题 下一主题

oracle工作机制问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-13 15:08 |只看该作者 |倒序浏览
请教高手!~~
  在对数据库表进行update且未commit时,这时进行的update是否已经修改了数据文件,rollback时是从回滚段中把修改前的数据再重新写回数据文件。

论坛徽章:
0
2 [报告]
发表于 2008-10-15 11:35 |只看该作者
未commit时update并未修改数据文件,只是修改了内存中的一个镜像块,dbwr运行时才会修改数据文件,

论坛徽章:
0
3 [报告]
发表于 2008-10-15 15:30 |只看该作者
看了一些资料,个人认为在未进行commit时,也有可能已经更新将数据文件更新,因为虽然在未commit时修改的是db buffer中的数据块,假如更新的数据块很多,脏数据列表达到一定长度时会触发DBWR将数据块写入数据文件,不知道是否是这样的。下边是个人总结的oracle执行update时的工作流程,请高人指点是否正确。

假如update语句影响的数据块在db buffer没有
第一步:从数据文件提前数据块
第二步:将读入的数据块的头部事务列表及SCN信息及被影响的行数据原值写入回滚段
第三步:将update语句影响的被读入DB BUFFER块中的这些行的ROWID及将要更新的原值和新值及SCN等信息写入log buffer
第四步:修改DB BUFFER中的数据块
第五步:服务器进程在脏数据列表中建立一条指向此DB BUFFER缓冲块的指针
第六步:假如update语句影响的数据块比较多,则重复执行1至5步
第七步:commit
在执行上述步骤时,LGWR根据一定机制将log buffer的日志写入日志文件,DBWR根据一定机制将db buffer中修改过的数据块里的信息写入数据文件

论坛徽章:
0
4 [报告]
发表于 2008-10-16 00:26 |只看该作者
你看Oracle官方文档的Concepts了么?
这里边有关于各种概念的标准答案

论坛徽章:
0
5 [报告]
发表于 2008-10-16 00:32 |只看该作者
原帖由 bjup 于 2008-10-13 15:08 发表
请教高手!~~
  在对数据库表进行update且未commit时,这时进行的update是否已经修改了数据文件,rollback时是从回滚段中把修改前的数据再重新写回数据文件。


是否修改数据文件重要么?

在update的时候, oracle会修改buffer cache中的数据块, 原数据块的内容被复制到了rollback segment的buffer cache中, rollback时rollback segment的buffer cache中的原数据块被复制到数据段的baffer cache中.

致于buffer cache中的数据是否被写到数据文件, 则要看DBWR的了.

论坛徽章:
0
6 [报告]
发表于 2008-10-16 10:40 |只看该作者
赞同3楼的说法,即便不commit,对数据的修改也可能写入数据文件,commit包含两种方式:直接执行commit属于显式提交,还有一种试隐式提交的。

论坛徽章:
0
7 [报告]
发表于 2008-10-18 13:41 |只看该作者
在同一个session下,执行update后未commit,在当前session下查询的数据为甚么显示已经更新。步骤如下:
1.select * from test;
num         date
1        2008-10-9 15:13:08
2        2008-10-9 15:13:08
3        2008-10-9 15:13:12
4        2008-10-9 15:13:13
5        2008-10-9 15:13:19
6        2008-10-9 15:13:25
7        2008-10-9 15:33:05
8        2008-10-9 15:33:06
9        2008-10-9 16:53:01
10        2008-10-9 16:53:09

2.执行uptate test set num=num+1;
3.查询select * from test;
num         date
2        2008-10-9 15:13:08
3        2008-10-9 15:13:08
4        2008-10-9 15:13:12
5        2008-10-9 15:13:13
6        2008-10-9 15:13:19
7        2008-10-9 15:13:25
8        2008-10-9 15:33:05
9        2008-10-9 15:33:06
10        2008-10-9 16:53:01
11        2008-10-9 16:53:09

4.重新打开一个session,查询select * from test;
num         date
1        2008-10-9 15:13:08
2        2008-10-9 15:13:08
3        2008-10-9 15:13:12
4        2008-10-9 15:13:13
5        2008-10-9 15:13:19
6        2008-10-9 15:13:25
7        2008-10-9 15:33:05
8        2008-10-9 15:33:06
9        2008-10-9 16:53:01
10        2008-10-9 16:53:09

目前可以理解步骤4查询的结果为甚么不更新。步骤3为甚么执行update未commit后,查询的数据为甚么做了更新,请高手指点。

论坛徽章:
0
8 [报告]
发表于 2008-10-18 22:34 |只看该作者
当前session做的更新当然应该可以马上被当前session看到!

关于读一致性,多版本,并发等问题,最好先看看Oracle® Database Concepts中相关的章节
http://download.oracle.com/docs/ ... /b14220/consist.htm

这个问题也可以参考各种关系数据库管理系统的教材,特别是大学教材。在教材中会对各种机制进行学术上的讨论,而不拘泥于某种单一的数据库技术。

论坛徽章:
0
9 [报告]
发表于 2008-10-19 10:09 |只看该作者
多谢blue_stone指点!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP