楼主: nishi2b

如果COMMIT时断电 是否会丢失数据?

[复制链接]
论坛徽章:
8
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:07:24ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
11#
发表于 2009-6-12 07:54 | 只看该作者
楼上,能否把同步异步说清楚点?谢谢。

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
9
生肖徽章2007版:牛
日期:2009-03-10 21:26:492010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:葡萄牙
日期:2010-02-22 14:35:242010新春纪念徽章
日期:2010-03-01 11:19:092010广州亚运会纪念徽章:射击
日期:2010-09-08 23:42:12ITPUB9周年纪念徽章
日期:2010-10-08 09:31:212010广州亚运会纪念徽章:拳击
日期:2010-10-30 00:46:582011新春纪念徽章
日期:2011-02-18 11:43:322011新春纪念徽章
日期:2011-03-01 08:49:39
12#
发表于 2009-6-12 09:08 | 只看该作者

回复 #11 sqysl 的帖子

Oracle 9i&10g编程艺术 中的原话:
我个人认为的“同步”:
即使我们有一个长时间运行的事务,但在提交之前,它生成的许多缓存重做日志已经刷新输出到磁盘了(而不是全部等到提交时才刷新输出)。这也有不好的一面,COMMIT时,我们必须等待,直到尚未写出的所有缓存redo都已经安全写到磁盘上才行。也就是说,对LGWR的调用是一个同步(synchronous)调用。尽管LGWR本身可以使用异步I/O并行地写至日志文件,但是我们的事务会一直等待LGWR完成所有写操作,并收到数据都已在磁盘上的确认才会返回。
我认为的“异步”:
由于某种原因,我们用的是一个Java程序而不是PL/SQL,这个原因就是PL/SQL提供了提交时优化(commit-time optimization)。我说过,LGWR是一个同步调用,我们要等待它完成所有写操作。在Oracle 10g Release 1及以前版本中,除PL/SQL以外的所有编程语言都是如此。PL/SQL引擎不同,要认识到直到PL/SQL例程完成之前,客户并不知道这个PL/SQL例程中是否发生了COMMIT,所以PL/SQL引擎完成的是异步提交。它不会等待LGWR完成;相反,PL/SQL引擎会从COMMIT调用立即返回。

使用道具 举报

回复
论坛徽章:
8
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:07:24ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
13#
发表于 2009-6-12 10:50 | 只看该作者
同步这块基本看明白了,也认可这个结论,可是异步这块,没看明白,我还是看看原版去吧,翻译的不好,楼上的兄弟能否告诉一下具体是什么章节的那一页,谢谢。

[ 本帖最后由 sqysl 于 2009-6-12 10:51 编辑 ]

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
9
生肖徽章2007版:牛
日期:2009-03-10 21:26:492010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:葡萄牙
日期:2010-02-22 14:35:242010新春纪念徽章
日期:2010-03-01 11:19:092010广州亚运会纪念徽章:射击
日期:2010-09-08 23:42:12ITPUB9周年纪念徽章
日期:2010-10-08 09:31:212010广州亚运会纪念徽章:拳击
日期:2010-10-30 00:46:582011新春纪念徽章
日期:2011-02-18 11:43:322011新春纪念徽章
日期:2011-03-01 08:49:39
14#
发表于 2009-6-12 13:37 | 只看该作者

回复 #13 sqysl 的帖子

第9章 redo和undo,差不多在9.3偏后的地方。

BTW:我觉得这本书翻译得算挺好的了

使用道具 举报

回复
论坛徽章:
8
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:07:24ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
15#
发表于 2009-6-12 20:21 | 只看该作者
我看了,你说的和楼主说的虽然有关,但从本质上说,你们说的是两回事,你说的是从编程角度说的,而楼主说的是系统内部的运行机制。

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2007-07-14 03:04:02ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44祖国60周年纪念徽章
日期:2009-10-09 08:28:00
16#
发表于 2009-6-12 22:30 | 只看该作者
原帖由 nishi2b 于 2009-6-1 17:51 发表
假设在COMMIT中突然之间断电。
是否会丢失数据? 这个时候REDO 应该还没有被完全刷新到文件中, 那么这个COMMIT的发出算是结束了呢 还是未结束呢?


commit中就说明正在commit,也就是commit还没有完成,那么这个时候掉电,实例启动后,这批数据会被进行回滚的。
因此不存在数据丢失的说法,应该问这批数据是否永久写入数据库了!

总之我们应该相信,oracle还是能保证数据一致性的。
比如我们存100W到银行,存的过程中停电了,那么钱我们肯定是可以拿回来的,那么我们的账户肯定也不会多出100W出来的!

使用道具 举报

回复
论坛徽章:
8
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:07:24ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
17#
发表于 2009-6-13 10:11 | 只看该作者
呵呵,赞成。
楼主既然提到了存钱时忽然断电,如果真的这种情况发生在现实中,那么银行该如何处理呢?把钱还给客户吧,担心库里存进去了,不还吧,担心没存进去,人家客户没见到存单或票据也不会干的,呵呵。。。

使用道具 举报

回复
论坛徽章:
38
2010新春纪念徽章
日期:2010-01-04 08:33:082012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25版主2段
日期:2012-05-15 15:24:11优秀写手
日期:2013-12-18 09:29:08马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
18#
发表于 2009-6-13 21:59 | 只看该作者
楼主的问题,二楼的是正解。

关于同步Commit和异步Commit,有觉得PL/SQL不可能是异步Commit的,因为这样就无法保证数据的安全了。原文应该是其他意思,中文翻译版我已经发现好几处错误了。我记得最可笑的错误是,哪一章我也记不太清了,是关于UNDO和REDO方面的章节,译者将一句话按英文原意写了出来,但是加了一个注解,注解中译者说英文写错了,应该是什么什么。但其实是译者理解错了,Tom原文并没有错。 不过,9i&10g编程艺术 已经比当年哪个 高级专家编程 翻译的好太多了,偶而的几处小错误,不影响阅读的。

使用道具 举报

回复
论坛徽章:
8
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:07:24ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
19#
发表于 2009-6-13 22:07 | 只看该作者
国人翻译的书还是不行,对读者的影响也是很大,就算没错,颠三倒四的没法看。
针对客户端应用来说,PL/SQL确实是可以异步的,但从内部机制来讲,都是一样的。人家老TOM也没写错,只是读者理解错了。

使用道具 举报

回复
论坛徽章:
38
2010新春纪念徽章
日期:2010-01-04 08:33:082012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25版主2段
日期:2012-05-15 15:24:11优秀写手
日期:2013-12-18 09:29:08马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
20#
发表于 2009-6-13 22:35 | 只看该作者
PL/SQL的提交默认是异步吗? 回头试试。
只记得有一个参数,可以设置是异步提交还是同步。

使用道具 举报

回复

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

本版积分规则 发表回复

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