查看: 6331|回复: 32

[讨论] 银行存钱悖论探讨!!

[复制链接]
论坛徽章:
1
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
跳转到指定楼层
1#
发表于 2010-1-11 23:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
银行存钱悖论探讨!!

以下纯属虚构如有雷同请对号入座。


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

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

-------------------------------------------------
例子中有一步是错误的,即db必须commit之后才会返回给操作端。所以在此对这个错误引来的不便表示歉意。而且我绝对不是在对db本身的机制质疑,二是对整体流程方面有疑问。其次,本贴确实不是什么悖论,用这个词只是为了吸引个眼球,就像签名广告一样,如果觉得碍眼,请多担待。

更正一下。
如果是存钱,出现这个问题,你就赚了,相当于拿了一笔现金,操作员重复操作给存了两笔、
如果是取钱,你就亏了,重复操作的结果就是取了两次而你只拿到一笔钱。
cu讨论的结果,这种情况下人的因素很重要,要靠人来解决。
-------------------------------------------------

[ 本帖最后由 冬瓜头 于 2010-1-13 08:57 编辑 ]
论坛徽章:
0
2#
发表于 2010-1-11 23:56 | 只看该作者
要,不过得先把流程再给详细的解析一下

使用道具 举报

回复
论坛徽章:
122
现任管理团队成员
日期:2011-05-07 01:45:08
3#
发表于 2010-1-12 00:05 | 只看该作者
"或者收到ack了,正要往日志里更新commit成功点了,Down机了" 这个不可能,数据库把commit写入日至之前不可能给app发出成功的消息

使用道具 举报

回复
招聘 : 系统架构师
论坛徽章:
372
双子座
日期:2015-08-18 12:18:21摩羯座
日期:2015-09-20 17:10:27秀才
日期:2015-09-21 09:46:16秀才
日期:2015-09-21 11:16:42秀才
日期:2015-10-08 17:57:58天枰座
日期:2015-10-28 18:28:29秀才
日期:2015-11-11 09:48:44秀才
日期:2015-11-11 10:07:14秀才
日期:2015-11-11 10:22:49秀才
日期:2015-09-11 10:43:06
4#
发表于 2010-1-12 00:06 | 只看该作者
步骤有错...

使用道具 举报

回复
论坛徽章:
122
现任管理团队成员
日期:2011-05-07 01:45:08
5#
发表于 2010-1-12 00:08 | 只看该作者

~

但是就在几分钟之前,应用服务器早就把成功的消息传回给了操作员终端 -- app怎么可能再没有接到数据库的相应之前就发给clinet成功的消息?

使用道具 举报

回复
论坛徽章:
114
授权会员
日期:2005-10-30 17:05:332013年新春福章
日期:2013-02-25 14:51:24奔驰
日期:2013-08-01 21:18:36宝马
日期:2013-12-04 21:52:282014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14
6#
发表于 2010-1-12 00:19 | 只看该作者
lz 连什么是悖论都没搞清楚把

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
7#
发表于 2010-1-12 08:04 | 只看该作者
“余额”改为“余额+5”是结果
应该有个动作叫做存入5

使用道具 举报

回复
论坛徽章:
1
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
8#
 楼主| 发表于 2010-1-12 08:54 | 只看该作者
呵呵,首先感谢各位的关注,这确实不是什么悖论,只是吸引点眼球罢了,不必太多心。
至于步骤有错,3楼和5楼的结论是因果关系,如果我能退出3楼结论也一样会造成问题的话呢?如果说db在没有给app回复的情况下就先写入commit点,那么如果是取钱,我取走了,你余额降低了,但是打算给app回复的瞬间,链路中断或者db down,那么操作员就会认为钱没有取走,db重启后,操作员再次重试,由于操作员刚才和现在都没有对余额的变化关注过,所以再次取走了钱,也就是说,db中钱被降低数值两次,而你拿到手的钱和回执单却只有一次,损失谁来给?

而且这是银行,有回执单可以作证,如果是没有回执单的应用呢?down个机就丢一些数据,链路中断也可能丢一些数据,真不知道这样怎么行呢?

各位,这个问题我是演绎了很长时间的,我是来请大家帮忙推翻我的结论的,如果能推翻万事大吉,如果不能推翻,现实中是如何解决这的问题的呢?多谢多谢!

使用道具 举报

回复
论坛徽章:
1
2010年世界杯参赛球队:葡萄牙
日期:2010-01-12 09:30:42
9#
发表于 2010-1-12 09:30 | 只看该作者
有回执单的话就有记录可查,还是会给你钱的

使用道具 举报

回复
论坛徽章:
19
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:06:13BLOG每日发帖之星
日期:2010-03-28 01:01:02ITPUB9周年纪念徽章
日期:2010-10-08 09:31:222012新春纪念徽章
日期:2012-01-04 11:51:22
10#
发表于 2010-1-12 09:44 | 只看该作者
这事多了吧,银行调账不就干这个的嘛

使用道具 举报

回复

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

本版积分规则 发表回复

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