|
银行存钱悖论探讨!!
以下纯属虚构如有雷同请对号入座。
某日我去银行存捡来的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 编辑 ] |
|