# alibaba **Repository Path**: it_apocalypse/alibaba ## Basic Information - **Project Name**: alibaba - **Description**: 蚂蚁金服笔试 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2018-07-25 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目介绍 蚂蚁金服笔试 # 需求 使用java语言编写, 实现一个转账接口. 该接口提供账户之间的转账服务,入参包括转入账号、转出账号,交易金额,以及交易单号,接口返回是否处理成功, 以及失败原因。请确保在并发请求下, 资金处理期间和最终, 用户的账户余额都不会透支,同一笔交易单不会被重复处理。不需要编写UI界面. 不需要连接数据库,数据库操作在内存中模拟即可。 # 分析 1. 保证转账接口的幂等性,同一个交易号只能进行一次转账操作,如果已存在,则将存在的转账信息返回 2. 转账过程(A账户向B账户转账)需要在一个事务里,避免造成死锁,将系统中的账户排序,账户id小的先执行 3. 为了保证在并发情况下,同一时刻只允许一个线程操作转账过程中涉及到的账户,但是其他账户可以被其他线程操作, 因此选择数据的行锁(Mysql InnoDB行锁 for update实现) # 设计 1. 定义ResultBody,同一系统返回结构 2. 定义GlobalExceptionHandler,统一处理系统异常 3. 定义ParaValidator,用于请求参数检查 4. 定义WebConfig,用于添加相关配置,如:添加FastJsonHttpMessageConverter # 说明 1. 项目启动时,会从accounts.txt文件中加载账户信息,用于演示转账过程 2. 转账完成后,可以调用账户查询列表接口查看相关账户信息