java 关于高并发下的银行转账问题

在转账操作中,一致性必须要保证的,转账的前后,各个账户的金额必须符合算术一致性

如何保证一致性? 引入事务机制是肯定的,但是这就够了么,下面我们对其进行测试

   

场景:

            小明账户中有10000元,小强账户中有10000元,小红账户中有0元

            有三个操作同时进行:小明给小红转账10元 ,小强给小红转账10元,小红自己往账户存入1元

            为了模拟高并发,我这里将上述操作复制300份,每份300个线程中同时执行

 

 

测试一:

代码如下:(测试代码,细节的判断我就省略了)

这里仅仅引入了事务机制,事务的隔离级别为 REPEATABLE_READ

 /**
     * 转账10元
     */
    @Transactional
    @Override
    public void testTransfer(Integer idFrom, Integer idTo) {
        //SQL语句 : select * from users where id=?
        Users from = usersMapper.selectById(idFrom);
        Users to = usersMapper.selectById(idTo);
        System.out.println(from.getUserName() + "向" + to.getUserName() + "转账 ");

        //这里加上10毫秒的延时,用于测试
        delay(10L);

        //转账方减10元
        from.setMoney(from.getMoney() - 10);
        usersMapper.updateByPrimaryKey(from);

        //这里加上10毫秒的延时,用于测试
        delay(10L);

        //收款方增加10元
        to.setMoney(to.getMoney() + 10);
        usersMapper.updateByPrimaryKey(to);
        System.out.println(from.getUserName() + "向" + to.getUserName() + "转账完毕---");
    }

    /**
     * 存入1元
     *
     * @param id
     */
    @Override
    @Transactional
    public void testDeposit(Integer id) {
        System.out.printl
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值