首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

有哪位高手知道银行的跨行转帐是如何保证交易的原子性和一致性

2012-10-27 
有谁知道银行的跨行转帐是怎么保证交易的原子性和一致性?最近在看《Java Transaction Design Strategies》,

有谁知道银行的跨行转帐是怎么保证交易的原子性和一致性?
最近在看《Java Transaction Design Strategies》,想到了对事务要求比较严格的银行间转帐这种事务,夸行转帐是怎么保证事务的原子性和一致性呢?首先我能想到的就是使用JTA,用两阶段提交,可是仔细一想,发现还是不能完整保证:
假设转帐步骤如下:
begin jta transaction
从A行A用户扣款 -->命名为A操作
往B行B用户存款 -->命名为B操作
commit or rollback

由于使用了两阶段提交,所以提交事务时,将发生
prepared commit A
prepared commit B
commit A
commit B

假如在prepared都没有任何问题,然后commit A成功,commitB时发生网络故障,失败,然后试图rollback A,发现与A数据库服务器网络也在这一瞬间发生故障,那就造成了从A扣款成功,但没能往B帐号存款。


我没有任何银行项目经验,当然这都是我的想象和假设 42 楼 balaschen 2007-05-14   讨论到现在,关于事务的问题基本可以定论了,或者讨论银行转帐业务异常设计更有意义,如何简单完备,系统异常的时候可以方便的追踪到每个异常并恢复,召唤做过相关业务的兄弟现身传道。 43 楼 pig345 2007-05-14   原来是这样阿!(原始的人工辅助处理,才是最智能与全能的)开了眼了。

另外谁能说说其他的关于业务分布式的实现方式么?
诸如:电信的夸系统(电信与网通)记账/日志、国家-省-市的电子政务平台间的公文流转等等。 44 楼 balaschen 2007-05-14   说说我们现在的系统,是一个基金交易电文(xml)传送的控制系统,提交时,把相关信息(xml)发送给一个交易结算中心,然后返回成功或失败,这一步执行后,需要更新本地数据库的状态信息。第一不执行成功之后,更新数据库状态有可能会失败(当然概率很低),现在的做法就是只是简单的给出提示,传送电文成功,更新数据库失败(台湾那边的designer设计的,用户也勉强接受这种做法),方法简陋之至,目前还没什么好的思路,请大伙支支招。
ps:原先有个想法就是在发送前记录操作日志,发送后,再记录日志,以作为后续人工处理的检查依据,可后来一想,发送成功后,记录日志,依然时可能失败的,又回到的原先的情况。如果消息不记录到数据库,而是发送一个jms,也是同样的情况。 45 楼 balaschen 2007-05-14   pig345 写道原来是这样阿!(原始的人工辅助处理,才是最智能与全能的)开了眼了。

另外谁能说说其他的关于业务分布式的实现方式么?
诸如:电信的夸系统(电信与网通)记账/日志、国家-省-市的电子政务平台间的公文流转等等。
你这些都是大问题,都不是一两句话能说清楚的。 46 楼 pig345 2007-05-14   balaschen 写道pig345 写道原来是这样阿!(原始的人工辅助处理,才是最智能与全能的)开了眼了。

另外谁能说说其他的关于业务分布式的实现方式么?
诸如:电信的夸系统(电信与网通)记账/日志、国家-省-市的电子政务平台间的公文流转等等。
你这些都是大问题,都不是一两句话能说清楚的。

是大问题没错,
但是这两年不少中小型系统/平台的开发中也经常会遇到这种业务上天然分布式的东西。
关键是之前的想法上,将 银行/金融/电信/电力/政府/铁路售票 等行业的系统实现神话了,以为完全是由软件编程给予保障的。

还是希望多些这方面的经验介绍。
现在业务上分布式的大大小小项目还是比较多,即使你的第一期不是分布式的,后续的开发也可能马上会遇到。 47 楼 daquan198163 2007-05-14   balaschen 写道说说我们现在的系统,是一个基金交易电文(xml)传送的控制系统,提交时,把相关信息(xml)发送给一个交易结算中心,然后返回成功或失败,这一步执行后,需要更新本地数据库的状态信息。第一不执行成功之后,更新数据库状态有可能会失败(当然概率很低),现在的做法就是只是简单的给出提示,传送电文成功,更新数据库失败(台湾那边的designer设计的,用户也勉强接受这种做法),方法简陋之至,目前还没什么好的思路,请大伙支支招。
ps:原先有个想法就是在发送前记录操作日志,发送后,再记录日志,以作为后续人工处理的检查依据,可后来一想,发送成功后,记录日志,依然时可能失败的,又回到的原先的情况。如果消息不记录到数据库,而是发送一个jms,也是同样的情况。
先更新数据库,后传送电文不就可以了?
传送电文失败抛出异常可以让数据库操作回滚 48 楼 balaschen 2007-05-14   daquan198163 写道balaschen 写道说说我们现在的系统,是一个基金交易电文(xml)传送的控制系统,提交时,把相关信息(xml)发送给一个交易结算中心,然后返回成功或失败,这一步执行后,需要更新本地数据库的状态信息。第一不执行成功之后,更新数据库状态有可能会失败(当然概率很低),现在的做法就是只是简单的给出提示,传送电文成功,更新数据库失败(台湾那边的designer设计的,用户也勉强接受这种做法),方法简陋之至,目前还没什么好的思路,请大伙支支招。
ps:原先有个想法就是在发送前记录操作日志,发送后,再记录日志,以作为后续人工处理的检查依据,可后来一想,发送成功后,记录日志,依然时可能失败的,又回到的原先的情况。如果消息不记录到数据库,而是发送一个jms,也是同样的情况。
先更新数据库,后传送电文不就可以了?
传送电文失败抛出异常可以让数据库操作回滚

更新数据状态需要根据传送电文的状态信息。
而且,即使先更新数据库,后传送电文,失败了回滚数据库当然没问题,成功了提交数据库依然会失败,没什么两样,而且还延长了数据库事务的时间,占用了资源。 49 楼 giscat 2007-05-14   很难保证一步到位
要人工对帐的 50 楼 balaschen 2007-05-14   有很多时候,操作是有顺序的,不能随意调换,这也是复杂性的根源 51 楼 stonecat 2007-05-14   国内银行的跨行转帐一般都是通过人民银行的系统做的。都是异步操作。如果从A行A帐户转到B行B帐户。A行先从你的帐户上扣款,然后给人行发报文,然后人行再把报文发给B行,B行再给你入帐。
每天下午会进行行间的一个扎差。

人行有两套系统:
大额支付系统;
  基本上是实时的,就是说人行接到报文后马上发给B行。
小额支付系统
  批量处理,隔一段时间处理一次。

而人行是按照报文向银行收费的,所以我们转帐时,快的要比慢的贵。 52 楼 jetever 2007-05-14   事务在银行系统内也只是保证本系统为准的。所以,如果你收款没有收到,那么你发起交易的这个系统会根据收款系统的对账文件,再把钱给你调整回来。当然调整也有可能出系统交易的一至,对于跨系统的,里面复杂的多了。各个系统间通讯一般是先把钱扣下来,然后发报文通知别的系统,如果没有相应,系统会自动重发。就这个重发交易就很难做。当然,日终的时候还要对账,对账还涉及到以哪一方为准的问题,一般转账这种交易,是以收款那个系统为准,这样你发起交易的那个系统就要根据首款那个系统的对账文件进行调整,当然调整也有可能出错,那就晕菜了。说到 会计,会计帐一般是来自每个交易,比如转账是个交易,这个交易就有个交易码,交易码会被 配置上会计动作,也就是这个交易涉及到哪些科目。日志对完帐后,就会根据产生的交易生产科目流水,然后再把科目发生额汇总,以产生当天的新的科目流水。帐务就是这么一天天的加起来的,当然了,有些对账可能一天之内还没有办法对,可能要跨两天甚至3天才能对,这就是业务帐和会计帐不付,反正这里面就是业务人员和技术人员吵架妥协的问题了。既要保证交易安全可靠,还要保证后台的会计是正确的。 53 楼 eddie 2007-05-17   我在05年的时候去某银行存钱,存了1800,当时很相信银行,存钱的凭证不知道放哪里去了。后来就不见了那笔钱。发现不对的时候,已经是2个月后的事情了,我去银行,他们告诉我要提供存款单或者告诉他们确切的存钱时间,我不见了存款单,也只能说是某天早上存的,几点也说不清,他们说没办法查,后来我这笔钱就不见了。哈哈,只能自认倒霉了,所以,奉劝请各位存钱的时候一定要保留好存款单。 54 楼 lutabo 2007-05-17   eddie 写道我在05年的时候去某银行存钱,存了1800,当时很相信银行,存钱的凭证不知道放哪里去了。后来就不见了那笔钱。发现不对的时候,已经是2个月后的事情了,我去银行,他们告诉我要提供存款单或者告诉他们确切的存钱时间,我不见了存款单,也只能说是某天早上存的,几点也说不清,他们说没办法查,后来我这笔钱就不见了。哈哈,只能自认倒霉了,所以,奉劝请各位存钱的时候一定要保留好存款单。

不太相信,银行还有"存款单"!除非是手工记账!

如果系统没记账,柜台现金与系统内现金不平, 柜台MM没方法下班,要找到错误才能下班,呵呵






55 楼 china2wto 2007-05-17   我上次到工行ATM上取钱,第一次取钱过程失败,系统提示取钱失败,我重新插入再次取钱,取钱成功。不知道为什么第一次失败。到后来对账的时候,发现这次交易过程大致为:
贷2000
借2000
贷2000
也就是第一行和第二行借贷抵消。也许这就是银行的事务回滚过程吧。
56 楼 julyboxer 2007-05-17   呵呵。看了上面各位大师精彩的讨论,学到了很多知识,在这想说说我的一个想法。
全局性事务控制是肯定没有办法实现的。只能做好局部全局性,就是各自先把自己的事情做好,而跨系统之间的事务处理,则应该提供良好的接口,以跨行转账为例,应该先确保自己的操作正确之后,再向人民银行发出请求,人民银行根据请求报文进行正确处理,发报文给要求转账银行说明已经处理该事务,而同时发报文给转账银行进行转账处理,如果转账出现错误,则发消息给人民银行要求进行事务回滚,人民银行自己进行事务回滚之后,再发消息给要求转账银行进行事务回滚吧。。
至于其中出现的消息发送失败,则真的只能进行人工处理,或者数据模拟操作了。。
PS:个人理解,有错误,大师们请多拍砖,这样我才会进步,哈哈- -
57 楼 wolfsquare 2007-05-18   1.首先保证各系统自己的帐正确,是平的。
2.两系统间通过多种方式对帐(即时处理,日对帐,月对帐)
鉴于银行业务数据量的特征,估计不会存在大范围内的事务控制。
国内银行我不知道,但是我知道UBS的系统是存在着手工纠正这种机制的。 58 楼 ray_linn 2007-05-18   balaschen 写道很想知道银行是怎么对帐的,难道面对那一大驼数据一行一行的对?

会计对账基本准则:

有借必有贷,借贷必相等。
总帐=分户账之合(总分核对)。总帐是一个人记的,分户帐是另一个人记的。
每日轧平。

三条基本。

所以银行之间是以信用为依据的,两个原子的系统,中间以公信的报文来连接。 59 楼 muramase 2007-05-21   碰到过银联卡取钱...卡所在银行确实扣款了,但是ATM机,抛出个异常...结果米都没,后来还是N个工作日以后对账来的,跨行取的话,忒麻烦饿.. 60 楼 zhuixinjian 2007-05-21   我取钱遇到过,取800,结果ATM没出,找银行登记,他们说要一个星期后才有结果,难道他们是一个星期才做一次帐?
一星期后的确拿到了钱。

stonecat:
如果从A行A帐户转到B行B帐户。A行先从你的帐户上扣款,然后给人行发报文,然后人行再把报文发给B行,B行再给你入帐。
每天下午会进行行间的一个扎差。

A行是先扣款还是发报文?如果A行扣了款,而发报文出错,那不是亏了? 61 楼 eastlift 2007-05-30   zhuixinjian 写道我取钱遇到过,取800,结果ATM没出,找银行登记,他们说要一个星期后才有结果,难道他们是一个星期才做一次帐?
一星期后的确拿到了钱。

stonecat:
如果从A行A帐户转到B行B帐户。A行先从你的帐户上扣款,然后给人行发报文,然后人行再把报文发给B行,B行再给你入帐。
每天下午会进行行间的一个扎差。

A行是先扣款还是发报文?如果A行扣了款,而发报文出错,那不是亏了?这个问题,第一给我感觉似乎很简单,就如

stonecat:
如果从A行A帐户转到B行B帐户。A行先从你的帐户上扣款,然后给人行发报文,然后人行再把报文发给B行,B行再给你入帐。
每天下午会进行行间的一个扎差。

所说,人行是通过事务进行的.一但错误,即各自滚回

有异义的,请指点.谢谢

热点排行