楼主: 我上面有人

讨论:不要回滚怎么样?

[复制链接]
论坛徽章:
4
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44生肖徽章2007版:虎
日期:2009-03-01 12:38:04蛋疼蛋
日期:2011-08-09 08:26:22ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41
11#
发表于 2008-3-28 13:59 | 只看该作者
前滚和回滚在数据一致性上有区别:
例如A用户在时刻1发出对a表查询(由于查询很大,要很长时间),B用户在时刻2发出a表的update语句,在时刻3提交,时刻4时B的查询完成。
如果是回滚,a表的旧数据在回滚段内,B提交时能够保证A的查询仍然能够查到时刻1的数据
如果是前滚,在B用户提交时新数据会被写入数据表空间,这样就造成了旧数据丢失,此时A用户的查询还没有完成,就会造成A的查询或者中断或者数据错误。

使用道具 举报

回复
论坛徽章:
1
祖国60周年纪念徽章
日期:2009-10-09 08:28:00
12#
发表于 2008-3-28 14:12 | 只看该作者

回复 #1 我上面有人 的帖子

那Flashback功能就用不了了,俺最近岁数大了,脑子慢了总爱犯错,Flashback对我来说还有些用。

使用道具 举报

回复
论坛徽章:
7
授权会员
日期:2010-12-06 19:50:26数据库板块每日发贴之星
日期:2011-09-03 01:01:01迷宫蛋
日期:2011-09-08 16:30:08ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04玉石琵琶
日期:2012-02-21 15:04:38最佳人气徽章
日期:2012-03-13 17:39:18
13#
 楼主| 发表于 2008-3-28 14:46 | 只看该作者
原帖由 youngcow 于 2008-3-28 13:59 发表
前滚和回滚在数据一致性上有区别:
例如A用户在时刻1发出对a表查询(由于查询很大,要很长时间),B用户在时刻2发出a表的update语句,在时刻3提交,时刻4时B的查询完成
如果是回滚,a表的旧数据在回滚段内,B提交时能够保证A的查询仍然能够查到时刻1的数据
如果是前滚,在B用户提交时新数据会被写入数据表空间,这样就造成了旧数据丢失,此时A用户的查询还没有完成,就会造成A的查询或者中断或者数据错误。

如果我没有理解错误,应该是“时刻4时A的查询完成”吧。
这些问题我觉得锁机制应该能够解决的。

使用道具 举报

回复
论坛徽章:
59
狮子座
日期:2016-03-26 13:35:402013年新春福章
日期:2013-02-25 14:51:24双黄蛋
日期:2013-02-25 11:06:15ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:20灰彻蛋
日期:2012-04-25 13:19:33紫蛋头
日期:2012-03-14 11:16:09最佳人气徽章
日期:2012-03-13 17:39:18玉石琵琶
日期:2012-02-21 15:04:38鲜花蛋
日期:2011-11-30 14:13:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
14#
发表于 2008-3-28 15:17 | 只看该作者
确实,用undo表空间rollback的开销会比较大,但是同样道理,用了你的'回滚'表空间那么commit操作的开销就比较大,right?
一个正常的系统一般都是commit远大于rollback的,虽然有些东西实现起来可能更方便,但是性能不见得就好

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
25
生肖徽章2007版:龙
日期:2008-05-06 11:07:48咸鸭蛋
日期:2011-10-19 10:09:12ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:542013年新春福章
日期:2013-02-25 14:51:24
15#
发表于 2008-3-28 15:29 | 只看该作者
读一致性怎么处理呢

使用道具 举报

回复
论坛徽章:
1
2013年新春福章
日期:2013-02-25 14:51:24
16#
发表于 2008-3-28 15:46 | 只看该作者
按照你的这种思路,有些地方我就想不明白,比如当我在执行对于一个表的一个长时间的查询时,如果另一个针对该表的事务提交了,需要将“前滚表空间”中的更改应用于该表,这该怎么处理?我也说不清你的想法对不对,只是按照你的思路有些地方想不通。

使用道具 举报

回复
论坛徽章:
7
授权会员
日期:2010-12-06 19:50:26数据库板块每日发贴之星
日期:2011-09-03 01:01:01迷宫蛋
日期:2011-09-08 16:30:08ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04玉石琵琶
日期:2012-02-21 15:04:38最佳人气徽章
日期:2012-03-13 17:39:18
17#
 楼主| 发表于 2008-3-28 16:23 | 只看该作者
原帖由 bluemoon0083 于 2008-3-28 15:17 发表
确实,用undo表空间rollback的开销会比较大,但是同样道理,用了你的'回滚'表空间那么commit操作的开销就比较大,right?
一个正常的系统一般都是commit远大于rollback的,虽然有些东西实现起来可能更方便,但是性能不见得就好

你说的有道理!但是,在“回滚”机制下,不管commit还是rollback,系统都要先将原有数据放入回滚表空间,这个开销应该是非常大的。
采用“前滚”机制,原有数据不用移动,rollback的开销肯定要小,commit的开销也不会比“回滚”增加。

[ 本帖最后由 我上面有人 于 2008-3-28 16:24 编辑 ]

使用道具 举报

回复
论坛徽章:
59
狮子座
日期:2016-03-26 13:35:402013年新春福章
日期:2013-02-25 14:51:24双黄蛋
日期:2013-02-25 11:06:15ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:20灰彻蛋
日期:2012-04-25 13:19:33紫蛋头
日期:2012-03-14 11:16:09最佳人气徽章
日期:2012-03-13 17:39:18玉石琵琶
日期:2012-02-21 15:04:38鲜花蛋
日期:2011-11-30 14:13:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
18#
发表于 2008-3-28 16:42 | 只看该作者
原帖由 我上面有人 于 2008-3-28 16:23 发表

你说的有道理!但是,在“回滚”机制下,不管commit还是rollback,系统都要先将原有数据放入回滚表空间,这个开销应该是非常大的。
采用“前滚”机制,原有数据不用移动,rollback的开销肯定要小,commit的开销也不会比“回滚”增加。

--系统都要先将原有数据放入回滚表空间
这个都一样的啊,这里是将before-image块放入回滚表空间,而原有数据的块则进行修改,变成所谓的脏块
而如果用你的方法,则是before-image块不去动它,按你的意思就是仍然在数据文件中,此时要把before-image块复制到'前滚'表空间再修改,也即脏块是放在'前滚'表空间中

oracle是把before-image块放入回滚表空间,你是把脏块放入'前滚'表空间,只要是实现一致读,这个开销总是无法避免的

使用道具 举报

回复
论坛徽章:
7
授权会员
日期:2010-12-06 19:50:26数据库板块每日发贴之星
日期:2011-09-03 01:01:01迷宫蛋
日期:2011-09-08 16:30:08ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04玉石琵琶
日期:2012-02-21 15:04:38最佳人气徽章
日期:2012-03-13 17:39:18
19#
 楼主| 发表于 2008-3-28 16:55 | 只看该作者
所以“前滚”在commit时,系统开销和“后滚”差不多;但在rollback时,“前滚”的开销就明显小于“回滚”了。

使用道具 举报

回复
论坛徽章:
59
狮子座
日期:2016-03-26 13:35:402013年新春福章
日期:2013-02-25 14:51:24双黄蛋
日期:2013-02-25 11:06:15ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:20灰彻蛋
日期:2012-04-25 13:19:33紫蛋头
日期:2012-03-14 11:16:09最佳人气徽章
日期:2012-03-13 17:39:18玉石琵琶
日期:2012-02-21 15:04:38鲜花蛋
日期:2011-11-30 14:13:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
20#
发表于 2008-3-28 17:18 | 只看该作者
原帖由 我上面有人 于 2008-3-28 16:55 发表
所以“前滚”在commit时,系统开销和“后滚”差不多;但在rollback时,“前滚”的开销就明显小于“回滚”了。

--所以“前滚”在commit时,系统开销和“后滚”差不多
这个怎么会差不多呢,如果是用'前滚'的办法,此时before-image在数据文件中,脏块在'前滚'表空间中的,好了现在要commit,你说该怎么做?

肯定从'前滚'表空间中的脏块再重新复制回数据文件(本身这一步就是重复的,一个块先从数据文件复制到'前滚',commit了之后再复制回数据文件),而before-image块又不能覆盖(为了保持其他会话的读一致性),此时数据文件中保留before-image块和修改后的块,要保留两个块,等retention时间过了之后再把before-image块清除

也就是每次commit都要这么折腾一遍,就像undo表空间每次rollback都要这么折腾一遍道理一样

[ 本帖最后由 bluemoon0083 于 2008-3-28 17:24 编辑 ]

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表