最近在考虑换工作,经历了两轮电话面试之后,蚂蚁金服给我发了一份笔试题目,需求如下:

使用java语言编写, 实现一个转账接口. 该接口提供账户之间的转账服务,入参包括转入账号、转出账号,交易金额,以及交易单号,接口返回是否处理成功, 以及失败原因。请确保在并发请求下, 资金处理期间和最终, 用户的账户余额都不会透支,同一笔交易单不会被重复处理。不需要编写UI界面. 不需要连接数据库,数据库操作在内存中模拟即可。

简单分析需求之后,就开始撸代码了。代码实现以上传到码云上:代码地址

这里就简单的说一下,自己分析过程。

1. 对于支付相关的接口,必须保证其幂等性,即相同参数的转账请求,返回结构必须相同,统一笔交易只能执行一次转账,有关接口幂等性实现可以参考:相关支付业务测试中如何保证幂等性

2. 转账过程(A账户向B账户转账)需要在一个事务里

3. 为了保证在并发情况下,同一时刻只允许一个线程操作转账过程中涉及到的账户,但是其他账户可以被其他线程操作, 因此选择数据的行锁(Mysql InnoDB行锁 for update实现)

4. 在并发情况下,转账事务可能会造成死锁,

可能出现死锁的原因是,并发情况下对两个账户的操作无法保证其执行顺序

线程一执行的是:【账户A】给【账户B】转账
线程二执行的是:【账户B】给【账户A】转账

如果两个转账动作同时执行,则会出现
线程一会请求对【账户B】进行加锁,线程二会请求对【账户A】进行加锁
由于此时的【账户A】已由线程一进行锁定,【账户B】已由线程二进行锁定
此时就会产生死锁问题。

通过上面的问题描述可以发现,在一个转账的过程中【账户A】、【账户B】的执行是有序的
但是在多个转账过程中【账户A】、【账户B】的执行是无序的。
因此只要保证每次执行转账时对账户的操作按照顺序执行就可以避免死锁

例如在系统中对所有的账户进行排序:
【账户A】、【账户B】、【账户C】、【账户D】、【账户E】、【账户F】

线程一执行【账户A】给【账户B】转账逻辑:
1. 开启事务
2. 【账户A】的余额减去
3. 【账户B】的余额增加
4. 提交事务

线程二执行【账户B】给【账户A】转账逻辑:
1. 开启事务
2. 【账户A】的余额增加
3. 【账户B】的余额减去
4. 提交事务

将账户进行排序,保证转账过程中【账户A】始终先于【账户B】,这样就可以避免产生死锁问题。

解决方案:账户表中添加自增id字段,用于账户排序 id小的先执行,解决的方法很多

蚂蚁金服社招笔试——根据需求实现一个转账接口相关推荐

  1. 阿里-蚂蚁金服社招面经

    首先介绍一下自己,18年本科(末流985,电子信息工程专业)毕业,两年多工作经验,毕业第一年在一个国企,之后在杭州一个创业公司,这次面试的是蚂蚁金服.在这先申明,介绍这么详细只是为了大家方便参考,大家 ...

  2. 大厂面试系列(中)—拿到蚂蚁金服社招offer,过来还愿分享面经

    点赞关注,不会迷路!    前言 最近来给大家 分享一些好的面经和面试题.准备出一系列,持续更新.想看更多的可以点关注 来我主页看哈.点这里看大厂系列(上) 来吧 面试! 蚂蚁 面试前 蚂蚁的面试挺独 ...

  3. 【2022-09-15】蚂蚁金服秋招笔试三道编程题

    恭喜发现宝藏!搜索公众号[TechGuide]回复公司名,解锁更多新鲜好文和互联网大厂的笔经面经,目前已更新至美团.微软- 作者@TechGuide[全网同名] 点赞再看,养成习惯,您动动手指对原创作 ...

  4. 蚂蚁金服春招算法实习岗电话一面总结 2021.4.3

    总结 整个面试流程比较友好,通话21分钟.蚂蚁金服算法岗主要用到NLP.传统ML运筹优化等相关技术,自己是做CV的,几乎没怎么问自己正在做的东西,论文和比赛内容也没问.问的东西都算比较基础,自己表达得 ...

  5. java社招_社招|蚂蚁金服-Java-社招

    作者:一杯82年的Java 来源:牛客网 今年的面经,最后一份了,请大佬们参考.线程池 什么时候到达最大线程数 到达最大线程后继续提交的表现 用过哪些锁, synchronized Reentrant ...

  6. 蚂蚁金服面试及笔试(附自己的答案)

    本次进行了一轮笔试,然后进行一面,预计一面挂了,自我感觉答得很凌乱,虽然问的基本都会.面试除了心态,还有就是充分的准备,后续多多总结关注细节吧.以下是后续整理的简要面试提问: 1.自我介绍 1.自我简 ...

  7. 蚂蚁金服更名 一场有关数字科技的阳谋!

    历史很难假设,但我们相信这是蚂蚁必走的路,从科技到金融再回到科技,蚂蚁一路"踩坑"不少,但收获更多.最为重要的是,蚂蚁自己也没想到会在科技方面闯出一片市场,这次也是为了这个广阔市场 ...

  8. 蚂蚁金服研发的金融级分布式中间件SOFA背后的故事

    导读:GIAC大会期间,蚂蚁金服杨冰,黄挺等讲师面向华南技术社区做了<数字金融时代的云原生架构转型路径>和<从传统服务化走向Service Mesh>等演讲,就此机会,高可用架 ...

  9. 蚂蚁金服冯柯:下一个十年,核心自研技术将迎来黄金发展期

    [摘要: 本文根据冯柯老师在2018年5月10日[第九届中国数据库技术大会]现场演讲内容整理而成. 正文: 今天想和大家聊聊蚂蚁金服和自研技术.说到蚂蚁金服,大家很容易联想到中国新四大发明之一的支付宝 ...

最新文章

  1. c语言求跳水运动员成绩,跳水排名_C语言编程实例_C语言_最全面的网站教程
  2. 养成良好的学习习惯-浅谈学习方法(1)
  3. excel打开后灰色不显示内容_Excel二维表转换,一分钟就够
  4. BookMarklet:瑞士军刀你用了吗?
  5. ai创造了哪些职业_关于创造职业的思考
  6. BZOJ 2004 公交线路(状压DP+矩阵快速幂)
  7. 丘成桐: 没有经过考验的创新,往往深度不够
  8. html响应式五栏布局,HTML – 响应式2列CSS布局,包括固定宽度的侧边栏?
  9. Linux下调用fork或system启动子进程的信号和资源释放相关问题
  10. Rider找不到指定的 SDK Microsoft.NET.Sdk
  11. spring aop获取目标对象的方法对象(包括方法上的注解)(转)
  12. 思考题2(人车关系)
  13. 双剑携手良师益友,学习机行业破局在望
  14. SORPAS-焊接仿真模拟软件
  15. 2010年中国互联网十大事件
  16. Spring源码解析:Spring Aware 原理解析
  17. .webp是什么文件?怎么打开这种文件
  18. 新技能get,支付宝赚钱红包一天收入过百
  19. 前端canvas画海报
  20. 《Java并发编程的艺术》——线程(笔记)

热门文章

  1. vue3.0 引入Ueditor(百度编辑器)
  2. securefilepriv mysql,mysqlsecure-file-priv选项问题的解决方法
  3. php三极管驱动蜂鸣器计算,三极管驱动蜂鸣器这些“陷阱”要小心!
  4. 《Windows系统文件名详解(上)》
  5. 计算机网络 第一章、概述
  6. 菜鸟笔记--docker: Error response from daemon: failed to create endpoint vigorous_euclid on network......
  7. 我这样的情况可以转行做SAP吗?
  8. [论文阅读] (27) AAAI20 Order Matters: 基于图神经网络的二进制代码相似性检测(腾讯科恩实验室)
  9. Openwrt路由器挂载摄像头教程
  10. RotateAnimation类:旋转变化动画类