下面展示一些 `内联代码片`。
@Transactional(rollbackFor = Exception.class)
@Override
public ResponseResult<?> payCallBackHandlerTest(Long id){
TransactionRecord transactionRecord = transactionRecordService.selectOneById(id);
int transactionState = LiquidationConstant.STATE_SUCCESS;
transactionRecord.setState(transactionState);
int row = transactionRecordService.updateState(transactionRecord);
log.info(LiquidationConstant.LOG_PREFIX + "更新完成{}",transactionRecord.getTransactionSN());
if (row == 0) {
log.error(LiquidationConstant.LOG_PREFIX + "更新交易流水记录失败!交易流水号{}",transactionRecord.getTransactionSN());
throw new ServiceException("更新交易流水记录失败!交易流水号:" + transactionRecord.getTransactionSN());
}
return ResponseResult.buildSuccessResponse();
}
private void sendMqEventTest(TransactionRecord record) {
try {
test1();
test2();
}catch (Exception e){
log.error("异步发送异常"+JsonUtils.toJsonString(record),e);
}
}
@Async
public void test1() throws InterruptedException {
LateFeeEntity entity =new LateFeeEntity();
entity.setId(10L);
entity.setOverdueDay(3);
//Thread.sleep(2000);
lateFeeService.updateByPrimaryKeySelective(entity);
}
@Async
public void test2(){
PayOrderExtEntity entity =new PayOrderExtEntity();
entity.setId(10L);
entity.setPayFirstRentFlag(13);
payOrderExtMapper.updateById(entity);
System.out.println(1 / 0);
}
执行结果:三条更新操作都成功
1 修改异常报错位置
@Async
public void test2(){
PayOrderExtEntity entity =new PayOrderExtEntity();
entity.setId(10L);
entity.setPayFirstRentFlag(13);
System.out.println(1 / 0);
payOrderExtMapper.updateById(entity);
}
执行结果:test2更新失败,其他成功
2 修改cry-cath
private void sendMqEventTest(TransactionRecord record) throws InterruptedException {
test1();
test2();
}
执行结果:test2报错之后,整个事务回滚,全部执行失败
3 打印 e.printStackTrace();
private void sendMqEventTest(TransactionRecord record) {
try {
test1();
test2();
}catch (Exception e){
e.printStackTrace();
}
}
执行结果:全部成功
4 @Transactional去除rollbackFor = Exception.class
执行结果:全部失败
其实,造成上面的结果原因是因为在同一个类上。@Async无效,方法变成同步方法造成的
正确的用法如下
https://blog.youkuaiyun.com/w605283073/article/details/86538140