`
balaschen
  • 浏览: 192354 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

有谁知道银行的跨行转帐是怎么保证交易的原子性和一致性?

阅读更多
最近在看《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帐号存款。


我没有任何银行项目经验,当然这都是我的想象和假设
分享到:
评论
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行再给你入帐。
每天下午会进行行间的一个扎差。

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

有异义的,请指点.谢谢
60 楼 zhuixinjian 2007-05-21  
我取钱遇到过,取800,结果ATM没出,找银行登记,他们说要一个星期后才有结果,难道他们是一个星期才做一次帐?
一星期后的确拿到了钱。

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

A行是先扣款还是发报文?如果A行扣了款,而发报文出错,那不是亏了?
59 楼 muramase 2007-05-21  
碰到过银联卡取钱...卡所在银行确实扣款了,但是ATM机,抛出个异常...结果米都没,后来还是N个工作日以后对账来的,跨行取的话,忒麻烦饿..
58 楼 ray_linn 2007-05-18  
balaschen 写道
很想知道银行是怎么对帐的,难道面对那一大驼数据一行一行的对?


会计对账基本准则:

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

三条基本。

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


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

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






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

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

而人行是按照报文向银行收费的,所以我们转帐时,快的要比慢的贵。
50 楼 balaschen 2007-05-14  
有很多时候,操作是有顺序的,不能随意调换,这也是复杂性的根源
49 楼 giscat 2007-05-14  
很难保证一步到位
要人工对帐的
48 楼 balaschen 2007-05-14  
daquan198163 写道
balaschen 写道
说说我们现在的系统,是一个基金交易电文(xml)传送的控制系统,提交时,把相关信息(xml)发送给一个交易结算中心,然后返回成功或失败,这一步执行后,需要更新本地数据库的状态信息。第一不执行成功之后,更新数据库状态有可能会失败(当然概率很低),现在的做法就是只是简单的给出提示,传送电文成功,更新数据库失败(台湾那边的designer设计的,用户也勉强接受这种做法),方法简陋之至,目前还没什么好的思路,请大伙支支招。
ps:原先有个想法就是在发送前记录操作日志,发送后,再记录日志,以作为后续人工处理的检查依据,可后来一想,发送成功后,记录日志,依然时可能失败的,又回到的原先的情况。如果消息不记录到数据库,而是发送一个jms,也是同样的情况。

先更新数据库,后传送电文不就可以了?
传送电文失败抛出异常可以让数据库操作回滚


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

先更新数据库,后传送电文不就可以了?
传送电文失败抛出异常可以让数据库操作回滚
46 楼 pig345 2007-05-14  
balaschen 写道
pig345 写道
原来是这样阿!(原始的人工辅助处理,才是最智能与全能的)开了眼了。

另外谁能说说其他的关于业务分布式的实现方式么?
诸如:电信的夸系统(电信与网通)记账/日志、国家-省-市的电子政务平台间的公文流转等等。

你这些都是大问题,都不是一两句话能说清楚的。


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

还是希望多些这方面的经验介绍。
现在业务上分布式的大大小小项目还是比较多,即使你的第一期不是分布式的,后续的开发也可能马上会遇到。
45 楼 balaschen 2007-05-14  
pig345 写道
原来是这样阿!(原始的人工辅助处理,才是最智能与全能的)开了眼了。

另外谁能说说其他的关于业务分布式的实现方式么?
诸如:电信的夸系统(电信与网通)记账/日志、国家-省-市的电子政务平台间的公文流转等等。

你这些都是大问题,都不是一两句话能说清楚的。
44 楼 balaschen 2007-05-14  
说说我们现在的系统,是一个基金交易电文(xml)传送的控制系统,提交时,把相关信息(xml)发送给一个交易结算中心,然后返回成功或失败,这一步执行后,需要更新本地数据库的状态信息。第一不执行成功之后,更新数据库状态有可能会失败(当然概率很低),现在的做法就是只是简单的给出提示,传送电文成功,更新数据库失败(台湾那边的designer设计的,用户也勉强接受这种做法),方法简陋之至,目前还没什么好的思路,请大伙支支招。
ps:原先有个想法就是在发送前记录操作日志,发送后,再记录日志,以作为后续人工处理的检查依据,可后来一想,发送成功后,记录日志,依然时可能失败的,又回到的原先的情况。如果消息不记录到数据库,而是发送一个jms,也是同样的情况。
43 楼 pig345 2007-05-14  
原来是这样阿!(原始的人工辅助处理,才是最智能与全能的)开了眼了。

另外谁能说说其他的关于业务分布式的实现方式么?
诸如:电信的夸系统(电信与网通)记账/日志、国家-省-市的电子政务平台间的公文流转等等。
42 楼 balaschen 2007-05-14  
讨论到现在,关于事务的问题基本可以定论了,或者讨论银行转帐业务异常设计更有意义,如何简单完备,系统异常的时候可以方便的追踪到每个异常并恢复,召唤做过相关业务的兄弟现身传道。

相关推荐

    java 网银跨行清算 项目

    项目可能会采用两阶段提交(2PC)或者分布式事务解决方案,如Saga模式,确保交易的原子性和一致性。 4. **消息队列**: 为了处理高并发和异步操作,项目可能会使用RabbitMQ或Kafka作为消息中间件,实现任务解耦和...

    java-bank.zip_跨行_银行 java

    以下是对"java-bank.zip_跨行_银行 java"这个项目所涵盖的IT知识的详细解释: 1. **对象封装**:银行账户是一个典型的实体对象,它包含私有的属性如账号、用户名、密码、余额等。通过公有方法(如deposit()存款,...

    329_java银行业务管理系统_银行转账管理_银行存取款.rar

    在Java中,这可能涉及到对数据库的操作,如SQL查询来获取账户余额,更新转账记录,并确保交易的原子性和一致性。事务处理是这一部分的重点,以确保资金转移的准确无误。 3. **银行存取款管理** 存取款管理涵盖了...

    银行交易系统参赛版(Lcsky)

    同时,事务处理必须遵循ACID(原子性、一致性、隔离性、持久性)原则,确保数据的一致性和完整性。系统可能会使用数据库管理系统(如MySQL或Oracle)来存储和管理交易记录,这些数据库系统通常具备强大的事务处理...

    bank.rar_银行

    1. 数据一致性:遵循ACID(原子性、一致性、隔离性、持久性)原则,保证交易的正确性。 2. 高可用性:设计冗余备份和故障恢复机制,确保系统24/7运行。 3. 安全性:通过加密技术、防火墙、入侵检测等手段,防止...

    银行存取款系统说明文档

    5. **数据一致性**:系统应保证事务的ACID特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),确保交易的正确执行。 6. **Java技术栈**:标签中的“银行存取款系统...

    银行信用卡管理系统源代码

    此外,系统还可能使用事务处理机制,确保这些涉及资金流动的操作原子性、一致性、隔离性和持久性(ACID属性)。 转账功能则允许用户将信用卡账户的资金转至其他银行账户或接收他人的转账。这通常需要银行间的实时...

    分布式事务架构设计.pdf

    本地消息表是一种常见的分布式事务解决方案,例如在跨行转账场景中,先进行本地事务操作(如扣款并记录凭证),然后通过消息中间件通知另一方银行增加金额。消息中间件可以是事务性的,确保消息的可靠传递,或者采用...

    银行管理系统

    此外,SQL Server 2008还支持事务处理,确保了银行业务的原子性、一致性、隔离性和持久性,这对于金融系统的稳健运行至关重要。 银行管理系统的功能模块通常包括: 1. 用户管理:用于注册、登录和权限管理,确保...

    java网上银行系统

    同时,Spring的事务管理功能确保了银行业务操作的原子性和一致性。 三、Hibernate框架 Hibernate作为持久层框架,负责数据库操作。它通过ORM(Object-Relational Mapping)技术将Java对象与数据库表映射,降低了...

    数据库系统概论(第4版)第十四章.ppt

    例如,银行的跨分行转账操作就是分布式数据库的一个典型应用,需要同时更新不同节点上的数据库以保证数据一致性。 分布式数据库系统的一个关键特性是数据独立性,包括逻辑独立性、物理独立性和数据分布独立性。这...

    用java编写的在线交易(代码)

    为了确保交易的原子性和一致性,Java的JTA(Java Transaction API)和Spring的Transaction Management可以用来处理分布式事务,确保即使在部分操作失败时,整个交易也能回滚到一致状态。 6. **并发与性能** 高...

    NET_ATM系统全局

    5. **事务处理**:ATM交易通常涉及多个步骤,因此系统必须支持事务处理,确保交易的原子性和一致性。 6. **故障恢复与冗余**:系统需要有备份和恢复机制,以应对硬件故障或网络中断,保证服务的连续性。 7. **性能...

    深入理解高并发下分布式事务的解决方案.docx

    2. **在线下单场景**:在电商平台下单时,需要同时更新库存数量和订单状态,由于这两个操作通常涉及不同的数据库,因此需要通过分布式事务来保证数据的一致性。 #### 五、常见的分布式事务解决方案 1. **基于XA...

    RCBS:创建了一个小规模的银行系统,供柜员开设存款帐户并向客户发行ATM卡,以及让客户激活和查询其ATM卡中的可用余额

    4. **事务处理**:银行操作如开户、转账等涉及资金流动,需要保证原子性、一致性、隔离性和持久性,即ACID特性。Java的并发和同步机制,如synchronized关键字和java.util.concurrent包,可以用来保证在多线程环境下...

    某互联网大厂MySQL面试题-20题(附带答案)

    1. **InnoDB引擎**:InnoDB是MySQL中最核心的存储引擎,支持事务处理和行级锁定,提供了对事务的ACID属性的支持,同时实现了外键约束,保证了数据的完整性和一致性。 2. **ACID特性**:ACID是数据库事务处理的四大...

    数据库操作,包括把csv或excel表格导入数据库及各种SQL语言操作.zip

    6. **事务处理**:在需要确保数据一致性的情景下,如银行转账,使用事务来保证操作的原子性和一致性。 在实际工作中,掌握这些基础的数据库操作和SQL技能是必不可少的,它们可以帮助你有效地管理和利用数据资源,为...

    hbs:HBS为HBase提供可序列化的事务处理

    HBS可能采用了两阶段提交(2PC)或者其他分布式事务协议来确保跨行、跨表操作的一致性。这些协议允许在多个节点之间协调操作,以达到全局一致的结果,即使在节点故障的情况下也能保证数据不丢失。 HBS项目还考虑了...

Global site tag (gtag.js) - Google Analytics