当前位置:   article > 正文

java 关于高并发下的银行转账问题_java同时转账怎么保证数据不错误

java同时转账怎么保证数据不错误

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

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

   

场景:

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

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

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

 

 

测试一:

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

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

  1. /**
  2. * 转账10元
  3. */
  4. @Transactional
  5. @Override
  6. public void testTransfer(Integer idFrom, Integer idTo) {
  7. //SQL语句 : select * from users where id=?
  8. Users from = usersMapper.selectById(idFrom);
  9. Users to = usersMapper.selectById(idTo);
  10. System.out.println(from.getUserName() + "向" + to.getUserName() + "转账 ");
  11. //这里加上10毫秒的延时,用于测试
  12. delay(10L);
  13. //转账方减10元
  14. from.setMoney(from.getMoney() - 10);
  15. usersMapper.updateByPrimaryKey(from);
  16. //这里加上10毫秒的延时,用于测试
  17. delay(10L);
  18. //收款方增加10元
  19. to.setMoney(to.getMoney() + 10);
  20. usersMapper.updateByPrimaryKey(to);
  21. System.out.println(from.getUserName() + "向" + to.getUserName() + "转账完毕---");
  22. }
  23. /**
  24. * 存入1元
  25. *
  26. * @param id
  27. */
  28. @Override
  29. @Transactional
  30. public void testDeposit(Integer id) {
  31. System.out.println("小红自己存钱
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/404448
推荐阅读
相关标签
  

闽ICP备14008679号