项目使用的是spring+mybatis+mysql,今天,我需要把处理一个业务就是,当用户出金失败时,事务能够回滚,同时减少用户的等待时间,因为我发现当处理失败时,用户需要等上1分钟以上的时间,这是不合理的。那么经过一系列的调查发现:spring的事务超时(使用Java注解方式)和mysql InnoDB事务超时是相互关联的。
在一个需要进行事务回滚的方法上加入@Transactional的事务注解,timeout超时时间设置为2秒,也就是说发生事务回滚后,2秒钟后对用户响应。
@Transactional(timeout=2) public int updateForzenMoney(MoneyTransfer moneyTransfer, int uid) { // 如果是出金请求,则预扣除冻结资金 if (moneyTransfer.getType().intValue() == 1) { moneyTransferService.updateTotalmoneyForPerTransfermoney(uid, moneyTransfer.getAmount()); // 将请求插入money_transfer表中 moneyTransferService.addMoneyTransfer(moneyTransfer); return 1; } else { moneyTransferService.addMoneyTransfer(moneyTransfer); return 2; } }
通过mysql控制台的模拟操作(强迫发生事务回滚),发现updateForzenMoney方法前后执行时间远远大于2秒的时间,为什么呢?