`
balaschen
  • 浏览: 192367 次
  • 性别: 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帐号存款。


我没有任何银行项目经验,当然这都是我的想象和假设
分享到:
评论
21 楼 balaschen 2007-05-10  
看来正如xiaoyu所说,最终还是要靠人来解决异常的问题
20 楼 抛出异常的爱 2007-05-10  
balaschen 写道
抛出异常的爱 写道
ATM也不是inter网。

如果在柜台操作就是内网了,柜台操作应该一样存在上面说的情况吧。

以太与ATM是两种不同的底层传输过程。。。。
不清楚柜台用的是否以太。。。。
不过ATM的帧要求比以太高的多。
19 楼 xiaoyu 2007-05-10  
关于转帐这个事, 其实更多的是法律上, 或者规范上规定得很严格(这些都是对人的, 对于失败后, 人为的处理).

所以一般转帐的系统都是挺简单的.

没有哪个系统是能保证事务完整的, 总有一些极少的情况会失败. 很多完美的词语只不过是广告.
18 楼 yumeyume 2007-05-10  

一般都用Tuxedo这种中间件去处理吧
17 楼 balaschen 2007-05-10  
抛出异常的爱 写道
ATM也不是inter网。

如果在柜台操作就是内网了,柜台操作应该一样存在上面说的情况吧。
16 楼 balaschen 2007-05-10  
lane_cn 写道
不可能靠数据库来保持事务的,一个用户转账需要好几分钟,占用一个事务,别的用户都要等,这是不可能的,数据库也没有能力支持这么多的并发连接。
只能在系统设计的时候尽量多的考虑到各种异常情况,留下记录,制定一个尽量保险的对账策略和异常处理方式,然后严格的对操作岗位进行管理。解决了这些问题,最终的正确性是有保证的。
不仅银行,电信、电力的账务也是这么干的,他们与银行的接口,还有系统内部都要考虑异常情况,每天进行对账。

是不可能靠数据库保持事务,可JTA不仅仅是数据库事务,只要支持XA的资源,就可以实现事务管理。
15 楼 抛出异常的爱 2007-05-10  
ATM也不是inter网。
14 楼 lane_cn 2007-05-10  
不可能靠数据库来保持事务的,一个用户转账需要好几分钟,占用一个事务,别的用户都要等,这是不可能的,数据库也没有能力支持这么多的并发连接。
只能在系统设计的时候尽量多的考虑到各种异常情况,留下记录,制定一个尽量保险的对账策略和异常处理方式,然后严格的对操作岗位进行管理。解决了这些问题,最终的正确性是有保证的。
不仅银行,电信、电力的账务也是这么干的,他们与银行的接口,还有系统内部都要考虑异常情况,每天进行对账。
13 楼 balaschen 2007-05-10  
抛出异常的爱 写道
出现这种可能在百万分之一以下。。。

这个数据是怎么来的 ,貌似遇到失败的兄弟还不少啊
12 楼 rainlife 2007-05-10  
balaschen 写道
也就是没办法完全保证事务的完整性喽?那是否会出现转帐失败,自己帐号上的钱也被扣了,要等银行对帐完才能恢复?我自己是没碰到过,有人碰到这种情况吗

这个我碰到过,结果只有等到银行对帐后才返回的。
11 楼 balaschen 2007-05-10  
即使是这样,银行对中心的转帐依然会失败,比如:
begin jta transaction
从A行A用户扣款 -->命名为A操作
往中心发转帐操作请求文件 -->命名为B操作
commit or rollback

由于使用了两阶段提交,所以提交事务时,将发生
prepared commit A
prepared commit B (发送转帐请求文件到中心,并接收到中心回应收到文件信息)
commit A
commit B (发送确认信息到中心)

在这个操作中,依然会发生 commitA成功,commitB失败

中心和各个银行间事务应该也是类似。
10 楼 抛出异常的爱 2007-05-10  
出现这种可能在百万分之一以下。。。
9 楼 balaschen 2007-05-10  
多设了个中心,主要简化的是各个银行间的协调,由多点变为单点,但中心依然是需要面对多点,也就是事务依然可能会失败,需要人工干预
8 楼 xiaoyu 2007-05-10  
至于那个中心怎么样保证它的事务完整性, 应该要看它的事务设计了.

不过有很多事都不是能完美的. 只能说99%可能就够了. 1%让人工去干预.
7 楼 balaschen 2007-05-10  
哦,原来是这样,那国内估计也是通过银联之类的第三方机构来调度吧.
6 楼 xiaoyu 2007-05-10  
5楼说的是对的. 像在美国那边, 我们是通过ACH文件来转账的, 发这个ACH文件到某个中心去, 这个中心会帮你调度等等一些东西(真正转钱的,和各银行联系的), 如果出错了, 会在几天内发一个文件回来, 如果过了这么多天都没有收到什么消息, 就默认成功了. 如果出错了, 系统之间(你的转帐系统与中心)无法配合(就是各不认错)一定的次数, 这个事就要用法律解决, 系统这间再也不会理这件事了.

5 楼 balaschen 2007-05-10  
那银行是怎么对帐的,假如说,ATM机上剩下的现钞比银行对帐的结果多,可银行不认,消费者怎么办?或者ATM机上多出来的钱被银行管ATM机的人黑了
4 楼 qingyujingyu427 2007-05-10  
我有两个同事,都曾经从中国银行的ATM机取钱,结果卡上的钱扣了,可是钱没出来。
都是等银行对完帐以后,然后再还给他们。
连本行都没保证,别说跨行了,只是失误率比较低吧。
3 楼 balaschen 2007-05-10  
也就是没办法完全保证事务的完整性喽?那是否会出现转帐失败,自己帐号上的钱也被扣了,要等银行对帐完才能恢复?我自己是没碰到过,有人碰到这种情况吗
2 楼 rtdb 2007-05-10  
握手-确认-再确认

BTW,总归会有出错的时候,一般是每天要对一次帐。

相关推荐

    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