赞
踩
在转账操作中,一致性必须要保证的,转账的前后,各个账户的金额必须符合算术一致性
如何保证一致性? 引入事务机制是肯定的,但是这就够了么,下面我们对其进行测试
场景:
小明账户中有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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。