`
damiao_cn
  • 浏览: 87731 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

重复提交一笔转账交易的问题

阅读更多
先说下这个问题的背景:
熟悉银行业务的朋友们都知道对于一笔网上转账交易来说,假如客户通过网络银行给其他人转账,他发现在网银关于资金转入行的选项中没有他要转入的那个分行或支行,他就必须手工输入银行名称或行号,然后此笔转账交易将落地到后台系统,由银行的柜员手工查找该转入行对应的联行号,方可完成此笔转账,而这样的柜员大多数只专门负责这种交易,眼睛直勾勾盯着柜员机,发现有一笔新的落地交易后就会帮助客户来录入联行号以实现转账。
此时情况就出现了:假设现在有2个柜员同时看到了这笔交易,然后他们在很短的时间间隔内先后录入了联行号点击确定,这就使一笔流水号发向银行核心系统后(由于网络传输是要时间代价的)还没来得及返回,另一柜员提交的同样的一笔流水又发到核心去了。最终客户发现,自己本打算转2w给一个客户,最后却出去4w块钱,不愤怒才怪,呵呵
加之我出差所在的银行的大额系统(也就是快速异地转账系统)没有防止重复提交的功能,换言之,一笔流水号提交上去2次,银行的核心系统就会傻了吧唧的给客户转2次账……
我们公司的系统是一个渠道,本不应该搞这个,但由于乙方从来都是孙子,所以只好替核心的不足擦屁股,设法解决这个问题
费了半天话才刚进入正题,解决上面的问题,方案很简单:
在网银的数据库中新建一个表,就一个字段(主键),用于储存流水号,在发银行核心系统之前,将要转帐的这笔流水insert到此表中(此时第二个柜员就无法再次录入这笔交易了,利用数据库的锁,防止了重复提交),当核心返回数据后判断:
当返回的数据是一个连接异常时,删去数据库中这笔流水(核心压根没接到这个包)
当返回的数据是一个返回超时异常时,不做任何处理(这时代表数据包已经传递给核心系统,至于转账成功与否由于没有得到返回数据我们无从知晓,故只好等待晚上跑批时将当日状态对账)
当返回的数据是核心交易异常时,删去数据库中这笔流水(此笔转账没成功,允许其他柜员再次提交这笔交易)
当返回的数据是交易成功时,不做处理(将此交易的流水号留在库中,其他柜员就无法再次录入此流水的交易)
2
0
分享到:
评论
7 楼 damiao_cn 2008-11-12  
yefeng 写道

damiao_cn 写道
yefeng 写道 你这样做,只能把表设成悲观锁才能解决问题,不然还是会出现问题的 不用设锁吧,表的唯一字段是主键,一条流水只能insert一次,这似乎就够了 那你只能把流水号做为主键,并保证流水号唯一

呵呵,哥们,我在博客里写了啊:“在网银的数据库中新建一个表,就一个字段(主键),用于储存流水号”
6 楼 yefeng 2008-11-11  
damiao_cn 写道

yefeng 写道
你这样做,只能把表设成悲观锁才能解决问题,不然还是会出现问题的 不用设锁吧,表的唯一字段是主键,一条流水只能insert一次,这似乎就够了

那你只能把流水号做为主键,并保证流水号唯一
5 楼 sdh5724 2008-11-10  
web 应用也有这样的问题。
4 楼 damiao_cn 2008-11-10  
yefeng 写道

你这样做,只能把表设成悲观锁才能解决问题,不然还是会出现问题的

不用设锁吧,表的唯一字段是主键,一条流水只能insert一次,这似乎就够了
3 楼 yefeng 2008-11-10  
你这样做,只能把表设成悲观锁才能解决问题,不然还是会出现问题的
2 楼 bydway 2008-11-10  
这样的问题,只要设计好一个同步机制,应该可以解决这个问题。
1 楼 ozzzzzz 2008-11-09  
这个问题经常出现,不仅仅是银行,其他系统比如物流配送,药房配药。问题其实并不是出自软件系统,而是在于业务系统。
比如我们设想一下,没有计算机这个系统,比如在药房。只有拿到药方,你才可能配药。所以不会出这个问题。而这里之所以会出这个问题,其实就是有数个人可能都拿到药方。但是也请注意,一个药方只有一个流水号ID。也就是说你只要保证,一个流水ID只能被提交和运行一次,那么就没有问题。具体如何做到这点,方法就多了。你们这样的做法当然可以,但是这不是唯一的做法。

相关推荐

    php支付宝转账接口封装,简单配置即可可用

    7. **安全性考虑**:在实际部署中,要考虑接口的安全性,例如防止重复提交、避免敏感信息泄露等。可以使用事务处理、验证码、IP限制等手段来增强安全性。 8. **测试与调试**:在实际使用前,需要进行充分的单元测试...

    php微信转账到零钱V2和V3代码

    单笔转账API是微信支付的基础转账接口,适用于一次向一个微信用户转账的场景。`WxpayTransfer.php` 文件中应该包含了调用微信支付API进行单笔转账的逻辑。主要步骤如下: - **配置初始化**:设置商户号、API密钥、...

    SQL事务处理代码共享

    例如,当一笔转账操作成功完成时,会提交事务以更新双方账户余额。 4. 回滚事务:如果在事务过程中发生错误,可以使用`ROLLBACK`命令撤销所有更改,恢复到事务开始前的状态。在银行交易中,如果转账失败,需要确保...

    WEB网站系统安全解决方案.docx

    - **交易重复提交控制**:防止用户重复提交同一笔交易,避免造成不必要的损失。 - **异步交易处理**:支持异步交易处理,提高系统的响应速度和用户体验。 - **交易数据不可否认性**:确保交易数据的真实性和有效性,...

    财务岗位工作流程.doc

    财务部门在企业的运营中扮演着至关重要的角色,它负责管理公司的资金流动,确保每一笔收支都有序进行。本文将详细阐述财务岗位的主要工作流程,以便于理解各个岗位的职责与操作规范。 首先,现金出纳岗位是企业财务...

    数据库知识

    - 可以通过不同的隔离级别来控制这种行为,如读未提交、读已提交、可重复读和串行化。 ##### 4. 持久性(Durability) 持久性意味着一旦事务被提交,它对数据库所做的更改就是永久的,即使在系统崩溃或其他故障情况...

    Oracle事务.docx

    **应用场景**:在银行转账过程中,如果一笔交易涉及两个账户之间的资金转移,这笔交易必须作为一个完整的事务来处理。这意味着资金从一个账户中扣除并且转移到另一个账户的过程要么全部成功,要么全部失败。如果只...

    Spring Boot的Spring事务处理机制4大特性.docx

    - **应用场景**:假设两个事务都在试图更新同一笔数据,那么其中一个事务的操作结果不应影响另一个事务的操作结果。例如,事务 T1 正在尝试将某个商品的价格从 100 元改为 200 元,同时事务 T2 正在尝试将其价格从 ...

    快钱API付款

    解释:同一条交易信息被重复提交。 - **5201:订单不能被退款** 解释:该订单不允许进行退款操作。 - **5203:不是订单的所有者** 解释:当前用户不是订单的所有者,无权操作。 - **5204:超出退款时限**...

    dao设计模式DAO 设计模式之事务界定疯.pdf

    例如,在银行转账系统中,如果一笔转账操作被分割为多个步骤,那么这些步骤要么全部成功,要么全部失败,以确保不会出现资金的丢失或重复计算。 #### 四、DAO模式中的事务管理 在传统的DAO设计模式中,事务的管理...

    支票登记单.DOC

    7. **领用人**:领取支票的人,可能是内部员工、供应商或合作方,他们负责将支票提交给银行兑现或转账。 8. **审批人**:在支票支付前,通常需要经过财务部门或管理层的审批,以确保支出符合预算和政策。审批人的...

    出纳试用期个人实习总结600字.docx

    1. **记账**:出纳的基础工作是审核并记录各种原始凭证,包括支付的单据,需要确保每笔交易的准确性。记账凭证的制作需仔细,原始凭证需有个人签字。对错误的账目,及时修正,并记录工作心得,避免重复犯错。 2. **...

    详述MySQL事务的实现原理

    例如,在一个转账操作中,当向账户A转账金额时,先在redo log中记录下转账后的状态,即使在事务提交前系统崩溃,重启后可以通过redo log恢复这笔转账。undo log则记录了事务修改前的数据状态,用于在事务回滚时恢复...

    工程部工程付款申请单.doc

    1. **编号**:每个付款申请单都有唯一的编号,便于管理和追踪,确保每一笔款项的支付都有据可查,防止重复或遗漏。 2. **收款单位**:指接受付款的施工单位或供应商。了解收款单位的信息,有助于确保款项准确无误地...

    11.图解收银台:支付系统承上启下的关键应用_V20240124.pdf

    在支付系统内部,收银核心与支付引擎共同协作,确保每一笔交易都能够顺利进行。这两个子系统之间存在着紧密的联系,它们之间的高效协作是整个支付流程得以顺畅进行的基础。为了更好地理解这种合作关系,下面将通过一...

Global site tag (gtag.js) - Google Analytics