数据库中究竟是先写日志还是先写应用

JikeBaker 2010-01-12 04:05:56
今天逛ChinaUnix的时候,无意中看到一个帖子(网址:http://bbs.chinaunix.net/thread-1642606-1-1.html),楼主抛出了下述疑问:

某日我去银行存捡来的5块钱,操作员拿着我的卡和现金,鄙视的看着我,我没什么感觉,习惯了。当他刷卡之后,点击输入金额5,点击存入之后,数据发送到应用服务器,应用服务器命令数据库服务器将“余额”改为“余额+5”,并且commit。数据库服务器成功的将记录更新到了磁盘并且受到了文件系统成功写入的应答,该回复应用服务器成功的消息了,commit成功的消息到达了应用服务器的tcp协议栈缓存中,并且tcp成功的返回了一个珍贵的ack应答,数据库服务器还没收到这个ack呢,便Down机了,或者收到ack了,正要往日志里更新commit成功点了,Down机了。重启之后,当然是将这笔操作回退了,数据文件中的“余额+5”变回了“余额”。但是就在几分钟之前,应用服务器早就把成功的消息传回给了操作员终端,我也拿着回执单走了。但是我回去一看,怎么余额没有增加?我气冲冲的找到柜台,依然是鄙视的眼光,操作员说:5块钱,至于么!

兄弟们,你说这5块钱,我是要还是不要呢?

本贴另一个instance:
http://www.itpub.net/viewthread. ... p;extra=&page=1


然后,很自然地,楼下跟了一群,如何如何解决。

本来想直接在ChinaUnix上回复的,可惜本人没注册账户,也就只好转到CSDN上来讨论讨论

我是不认同ChinaUnix该帖楼主的意见的,
在上面的描述中,楼主将数据库记录数据的操作理解为先将所有应用数据都写入数据库后才记录数据操作日志,这样就会存在应用数据正常记录后,写日志时出现Down机时导致数据损坏,无法正确恢复,这也是楼主所抛出来的问题。

而据我的了解,DBMS不可能会先写应用数据,再写日志,而是先写日志再记录应用数据(至少在commit时会这样处理),这样,如果在写日志时Down机的话,将直接返回错误,未改变应用数据;而如果在写应用数据时Down机,日志已经完整的记录下来,DBMS就可以根据日志来恢复应用数据。

小弟浊见,还望指教!
...全文
469 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
j2eeprogramer 2010-02-08
  • 打赏
  • 举报
回复
首先,数据库表的写和日志写在一个事务中,一旦 commit成功,就不可能日志写失败。
JikeBaker 2010-01-12
  • 打赏
  • 举报
回复
没人回,我先自己顶起!

8,028

社区成员

发帖
与我相关
我的任务
社区描述
高性能数据库开发
社区管理员
  • 高性能数据库开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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