当前位置:   article > 正文

java 转账 锁_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.println("小红自己存钱");

Users user = usersMapper.selectById(id);

//延时10ms

delay(10

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/574623
推荐阅读
相关标签
  

闽ICP备14008679号