@Transactional和@Async事务执行测试

下面展示一些 `内联代码片`。
	@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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值