posts - 256, comments - 1319, trackbacks - 41, articles - 8
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

从银行ATM机取款失败说起

Posted on 2005-02-05 23:49 FantasySoft 阅读(2854) 评论(25)  编辑 收藏 所属分类: All About SoftThought Ware
        昨天晚上,我到中国银行的一台ATM机上取钱。插卡,输入密码,接着可供选择的操作出现:人民币提款,查询余额以及退卡。因为人民币提款选项的出现,所以我可以得知该ATM机是有现金可以提取的。于是很自然的,我先查询了余额,然后根据余额取相应的钱。当我选择了人民币提款,输入需要提取的金额之后,ATM机似乎开始罢工了,因为半晌都没有什么反应。大约两分钟左右,屏幕赫然显示出“通讯故障,操作无法执行”等字样,接着是一张单据被打印出来和退卡。我开始抱怨这糟糕网络,但是问题远没有那么简单。
         由于单据上打印出了我的提款金额,于是我想是不是我需要提取的金额超过了ATM机内现金的总数呢?但是,我很快就否定了这个推断,因为提取金额和ATM机内现金总额的比较是不需要去跟Server进行交互的,何来通讯故障呢?当时并没有继续往下想,就将卡再次插入ATM机,输入密码,接着可供选择的操作出现。这时我很惊奇的发现,人民币提款这一项已经消失了!让我更惊讶的是,我无法查询到自己帐户的余额!小屏幕显示着是ATM机的故障!然后,这个提示似乎是骗人的,因为当我的卡退出之后,Welcome的界面再次显示出来了。但是整台ATM机这时就是一台废物,因为其他人也无法从这里进行任何的操作,无法查询余额,更无法提款了。随后,我去其他银行,包括农业银行以及工商银行去查询卡上余额,但是都提示说发卡行无法进行操作。这时,我已经完全没有了办法,我根本无法知道钱是不是真的被扣掉了。到了今天,我再次到中国银行的ATM机上查询余额,发现钱已经少了!接着,我平生第一次投诉银行——填写了一份申诉表格。当询问柜台营业员需要多久才能将钱返还到我的帐户上,得到的答复是,需要3个以上工作日,由于是春节长假,最快也要到节后了。实在是太郁闷了!
        郁闷过后,我开始想,这样严重的错误是由于什么造成的呢?是否可以避免呢?以下是我自己的一些想法,受心情影响,可能会比较混乱,还请多多指教了。
        第一、这到底是一个怎样的错误呢?个人认为这是事务完整性的错误。用户取钱可以细分为几个步骤:用户输入取款金额 -> 检查输入是否合法,即客户端的校验。如是否为100的倍数以及是否超过一次取款的限度等 -> 检查用户帐户余额是否大于取款金额 -> ATM机出钱并且更新用户帐户余额 -> 用户将钱取走。在用户输入取款金额到用户将钱取走之间,能称得上事务的就是ATM机出钱并且更新用户帐户余额了。这两个操作本身是异步的,却是一个整体,也就是说其中一个操作失败了,另外一个操作就应该回退。而我的遭遇则是,ATM机没有出钱,但是余额却被更新了。
         第二、这个错误固然可以看作事务完整性发生了问题,但是这个事务却跟一般的事务有所不同。通常,我们将对数据库多张表的连续且有关联的更新看作一个事务,在这一连续的更新当中,只要有一个失败,则所有都失败。这样的事务还是比较容易实现的,毕竟所操作的是同一个数据库中的不同的表而已。但是在取款这个所谓的事务中,操作的对象则是不同的,一个是ATM机里装着的钱,一个则是用户的数据。根据事务的完整性,也就是说ATM机出了钱,但是用户帐户余额没有更新成功,就应该将钱从用户手上抢回来,但是,这样可能吗?因此,这个事务由于其操作对象的不同,其完整性的实现就存在很大的困难了。从保护银行本身利益方面去看,可以猜测银行的服务器应该是先更新用户帐户余额,接着向ATM机发送出钱的请求,然后ATM机再向服务器发送一个操作码,服务器再才真正更新数据表。
         第三、从第二点最后的猜测来看,ATM机没有出钱,就应该发送一个失败的操作码给服务器,然后服务器根据这个失败的操作码将用户帐户的更新回退,这样就不应该发生我所遭遇到的情况了。那么到底是什么导致了帐户的数据最终被修改了呢?我想所有的责任都应该是由这台ATM机来承担了。如果真的仅仅是ATM机的问题,或许问题就好解决了。但是,当我换了另外一台ATM机的时候,我无法查到自己的帐户余额。这意味着什么呢?我能够想到的,是数据表上了锁。我的帐户余额这个记录上了读跟写的锁。但是为什么要加锁呢?是不是连服务器本身也不清楚此时用户的余额到底是取款前还是取款后的呢?
         第四、最后我得出了一个结论,正是由于ATM机本身承载了太多的责任,不是一个真正的瘦客户端,直接导致了错误的发生。同时,我也觉得中国银行本身的程序如我现在的思路一样混乱。由混乱引发的程序的正确性与健壮性问题,着实让人汗颜啊!
        先说到这里了,希望这样的一个案例可以给大家一些别样的思考。

Feedback

#1楼    回复  引用    

2005-02-06 07:14 by grant [未注册用户]
现在打ATM主意的骗子满天飞,别是让人把那台ATM动了手脚。也不一定是软件的故障。

#2楼    回复  引用    

2005-02-06 09:04 by jerry [未注册用户]
中国银行的系统?懒得再说了!

#3楼    回复  引用    

2005-02-06 11:36 by KingofSC [未注册用户]
这涉及到分布式事务,但又没有采用象中间件这些来进行维护,而但靠atm跟主机得socket通讯来保证这个事务,所以交易过程任何一方或者通讯出错都会导致分布式事务得不完整。
如果在交易过程出现任何一方事务不完整,银行有一套自动冲正机制来保证事务完整性。

你得情况应该是,在银行主机扣钱后,atm跟主机通讯突然中断了
所以钱扣了,但atm不知道,所以你也拿不到钱。
这时候有两种方法解决:
1)通讯恢复后,atm自动发起冲正交易把钱还你
2)银行员工手动处理这个冲正
显然手动会有很多手续,自然要什么3天之类得拉

#4楼    回复  引用    

2005-02-06 11:36 by CsOver [未注册用户]
以后的钱,我想还是自己保管最好!

#5楼    回复  引用  查看    

2005-02-06 12:29 by 慕晓      
我觉得顺序应该是这样的:
用户     atm    服务器
提款-> 验证-> 验证
                          ->
拿钱<- 出钱<- 扣钱
                    -> 确认扣钱
如果从服务器扣钱到atm出钱这个中间通讯出现故障,那么服务器应当没有受到确认,那么。。。
 
还没想好,有点感冒,脑子不够用了。。。

#6楼    回复  引用  查看    

2005-02-06 15:09 by mikespook      
呵呵,我也遇到过一次,在中行取浦发行的钱~~~吞了我1000,还好,晚上打了个电话,第二天钱就补回来了~~~

#7楼 [楼主]   回复  引用  查看    

2005-02-06 22:15 by FantasySoft      
To KingofSC: 其中还有一个地方让人迷惑,就是我取款之前是能够看到“人民币提款”选项的,当我取款失败之后,该选项却消失了!

#8楼    回复  引用    

2005-02-25 09:55 by bankliu [未注册用户]
我觉得没有那么简单,银行提款需要多重验证,保证了事件的完整性,即使事件的中断导致一个事务的失败,可以通过回溯挽回事件,这正体现了其完整的一面
1、请求提款>用户验证,发送请求等信息>允许扣钱验证(发给客户机)>可以取款验证(发给服务端)>相互验证成功>
2、扣钱>扣钱成功(发给客户机)>取款>取款成功(发给服务机)
其中,从第二步开始就可以根据是否完整的步骤进行冲正。

#9楼    回复  引用    

2005-03-16 21:51 by 沈天宏 [未注册用户]
跟你一样吞了我900,在邮政局ATM机拉的,然后我第2天早上去邮政局贴了份表,他说手续最迟也要1星期。我晕掉了怎么慢,哎

#10楼    回复  引用    

2005-04-19 15:32 by yy [未注册用户]
唉,是够郁闷的哦

#11楼    回复  引用    

2005-05-11 11:41 by 枕边月亮 [未注册用户]
没那么复杂,你的只是在银行主机扣钱后,atm跟主机通讯突然中断了
所以钱扣了,但atm得不到确认信息,所以你也拿不到钱,而且从你在其它机器上也查不到信息来看,通讯断掉的原因可能是主机那边,比如正在做日终等,所以现在很多银行的24小时并非真正意义的24小时,总有一段时间是无法正常交易的。
据我所知,目前很多银行基本上没有了"确认扣钱"这一步,而是直接先扣掉钱,然后通知atm出钞,atm若出钞故障,在通讯正常情况下是会发冲正请求的。

#12楼    回复  引用    

2006-10-08 15:10 by 吴某某 [未注册用户]
十月五日,九点六分我到农行福州台江支行ATM机上取钱,插卡,输入密码,接着可供选择的操作出现:人民币提款,查询余额以及退卡。我输入提取金额1800.可是过了两分钟左右,ATM机上显示"系统错误,通信线路出现故障"然后就吐出银行卡,当时我也没有在意,拔卡就到对面的招商银行ATM机上取款,这一次很顺利,同样取了1800元.然后我查了一下余额不到400元.明明我卡上有4000元的.我赶快到交通银行查当日交易账款.发现农行ATM机吞了我1800元.当日马上找ATM机的农行.农行当时一个女的大嫂说;没有关系你留下身份证号与银行卡号以及金额,等下午下班前会打电话给我,我信以为真,以为他们会这样做.没想到到了五点五十五分我还没有接到电话,心急如焚,直接到农行找他们问个究竟,却说,ATM机里没有多出1800元.叫我明天去交行查一下.晕死,明明是在农行的ATM机上出的差错,怎么会叫我去交行呢?没有办法,晚上回家吃过饭,郁闷了半天,突然想起,每个银行都有一个投诉电话,我打了95599,农行的人工接线员,态度还不错,叫我打银联95516,说这样事情就可以解决了,接着我拨通了95516.银联的小姑娘说,要等到8号正式上班后去查.晕死,我又要郁闷两天.好不容易到8号(今天),我先去ATM机上查款.可是1800元照样没有回来,于是我到了原先吃钱的ATM机的农行,得到的回答却是要等十天以后再说,晕死,如果我们欠银行的钱,我们就不敢说等十天以后再说,回到家里我又拨通95516,把情况与人工接线员说明一下,人工接线员说今天会给我一个回复.果然过一个小时银联来电,建议我再到农行填一份ATM机故障顾客投诉单.这样后,再过三至五个工作日,就会有结果.于是我又到农行要求填单,而农行却说没有这个单,晕死,若大的一个银行连一个ATM机事故保障机制都没有,叫我拿什么相信你----中国农业银行.银行工作人员看我态度强硬,只好说用电话上报,电话联络后,我强烈要求要给我一个确切的时间,电话那头却说,他们也不知道具体要多长时间.最后农行负责人安慰说,不会很长,大概一周左右.晕死,如果一周能解决问题,让1800元的钱回到我的账户,也就算了.可是现在...这种情况多郁闷呀,只好等了,如果实在没有结果的话,只好找记者朋友帮忙了,或者去12315投诉了,反正为了这1800元, 我也已经被折腾够惨了,再多一点又何妨.

#13楼    回复  引用    

2006-12-02 18:30 by 吴某某 [未注册用户]
今天到徐家汇汇金百货楼下浦发银行的atm机取款,结果atm机扣了卡里面的钱,居然不出款,让我找浦发银行联系。我看街对面就有一家浦发银行,就进去让他们处理,银行的确是浦发,但是银行里面的人告诉我,汇金楼下的atm机属于浦东的银行,不属于他们,他们是不管的,让我去找浦东的银行,打电话给浦东的银行,那个浦东银行的家伙告诉我,不好意思,这个atm的确是他们的,但是他们星期六和星期天不上班,95528管丢钱的事情。再打电话给95528,查一下,的确承认我取了钱,但是不能确认是否能够返还给我,而且告诉我,浦发的atm分属各分支行,相互没有管辖权。而且浦发那个95528还告诉我,3个工作日是银联的规定,我跟他说银联就一公司,算什么规定。郁闷啊。

#14楼    回复  引用    

2007-01-15 13:26 by 苦恼的学生 [未注册用户]
我也是有这样的经历,吞了我的钱,一个月的生活费就这样没了,马上就要回家了,没钱真不知如何是好!

#15楼    回复  引用    

2007-06-21 15:37 by cherry [未注册用户]
我今天也遭遇了这么倒霉的事情!在建设银行的自助银行(旁边没有建设银行的人工营业厅)ATM取钱,第一次输入300的金额,后来显示通信失败,出来一张回单,后来再输入一次300的金额,300块钱终于出来了,但是查余额,已经扣去了我600块钱。我赶紧打电话给建设银行95533(因为去年遭遇ATM假钞事件,当时打了好多次这个电话,就一直存在通讯录里),他们给了我另外一个电话,可能是专门负责管理那个自助银行的(后来上网查那个电话号码,原来是营业部本部),很是着急,虽然钱数额并不多,但300块钱无缘无故飞走实在太冤了。对方留了我电话,说明天下午有人过去那家自助银行查账,如果发现钱多了会退还给我,唉!还要等到明天下午!不知道是否可以顺利处理好,但是本人实在是对银行没法信任,怕了它们了!因为去年国庆节时从建设银行ATM处取了100假钞,几经周折无果,银行根本不承认,后来只能自认倒霉。看来有钱的话还是自己保管的好!银行也不是个安全地方啊!

#16楼    回复  引用    

2007-09-20 16:27 by QQ176150245 [未注册用户]
我也是
07年9月19日22点
我用工行的卡在商业银行的取款机内取钱~`
妈的 我都是正常在操作
取1800~
结果凭单打出来了.
上面写的扣了1800~
可钱却不出来...
屏幕说什么系统错误..
我操~~现在钱都没要回来

#17楼    回复  引用    

2007-11-10 18:45 by xiaohe 10 [未注册用户]
aaaa

#18楼    回复  引用    

2007-11-10 18:47 by xiaohe 10 [未注册用户]
2007年11月4日
浦发银行的卡在工行进行异地取款,通讯故障后,然后就是谢谢使用,卡被退回,之后收到短信提示,钱已划帐,之后打电话给浦发,说要两周的时间处理,怎么这么长时间啊,

#19楼    回复  引用    

2007-11-10 18:50 by xiaohe 10 [未注册用户]
从我这次事件 我发现 工行服务较差啊 居然说没有我的取款记录
我想即使交易失败 也应该有记录吧 不然那套ATM系统肯定有问题啊
浦发的客服态度还是不错的 不过为什么要那么长时间呢

#20楼    回复  引用    

2007-11-16 09:42 by 喵喵 [未注册用户]
= =我也是11月4号用浦发卡在工行atm上异地取款,被扣了2500,浦发银行也说要两周时间处理,现在还没回复,不知道还拿得回来拿不回来了

#21楼    回复  引用    

2008-01-06 15:40 by ah [未注册用户]
浦发银行怎么这么破烂,我也经历了被扣款后不出钱的的事情,忒倒霉,这种小银行也不更新更新自己的系统和ATM,我们的利益去哪里了?

#22楼    回复  引用    

2008-01-14 16:34 by ff [未注册用户]
我今天也碰到了 超级郁闷
拿了工行的卡 去浦发的ATM机上取钱
钱没出来 帐面上金额少了
电话给工行 说要核实 5个工作日回复
第一次碰到 怎么这么不安全的!!!

#23楼    回复  引用    

2008-01-18 15:54 by lllll [未注册用户]
太郁闷了,今天我也遇到了,我在建行ATM机上用华夏的卡取钱,机器出现故障的字样,没出钱,可卡里却被扣了2500 ,立刻去问,说要等1周,银行也没给个凭证什么的,就给了电话号码,真担心他们不认账啊,难熬的一周啊

#24楼    回复  引用    

2008-02-20 21:08 by 陈昌欢 [未注册用户]
我也是与2月13号早在武汉广东发展银行的银联取款机上取钱,第一次取300元等了好久显示交易失败,我以为是别的问题结着又取300元又是交易失败。我再跑好远找到一家农业银行去取300元,上面显示余额不足,我忙查看上面扣了我两次交易失败的钱,我马上回那家银行打电话,他要我找我的发卡银行,可我的发卡银行是在广东东莞。我人在武汉,我再打电话95516他说是交易失败的话会在一个工作日后会自动反还到我的卡上。我放心了,回家一天就赶道广东东莞到农业银行去查,结果还是没有,我好失望。我问农业银行营业员她说没法查到失败的信息,我打电话99559她第一次说会在5天会有结第二次她又有人说是会在一个月之内会有结我不知道一个月以后会给我一个什么样的结果。今天95516打电话说查到交易失败的结果以发到农业银行,但我晚上去查还是失望,钱还是没打进卡上。我还要等多久才会有结果,钱还能找回来吗,是一天还是一个月还是我不敢望下想,也不知道找谁。

#25楼    回复  引用    

2008-07-17 21:51 by 可 [未注册用户]
我是2008年7月15日厦门工商银行24小时自助银行取款的,等了很久没反映,一直显示系统正在通信中,只好按下取消键,过了一会儿之后,出现系统通信错误,钱没有出来,在另外一台取款机上查询,发现钱已从账户上扣除,随后打电话到95588,表示三个工作日内回复,现在已经过去一天了,工行还没打电话,服务真的很差。也不知道这钱几时能回来

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-02-06 01:24 编辑过
 
另存  打印