Spring事务的@Transactional和try/catch

2022-08-22 12:55:54

首先,我们必须知道,默认spring事务只在发生未被捕获的 runtimeexcetpion时才会被spring aop异常捕获从而 回滚

try…catch就是捕获异常,然后处理掉,事务是不会回滚的;

@transactional 是要在系统抛异常的时候才能起到事务回滚的作用;

@Transactional(rollbackFor = Exception.class)
@Override
public Integer updateRecordOrdeNo(User user) {
	Integer flag = 0;
	try{
	   	 flag  = userMapper.save(user); // 表操作
    	//出现异常
    	1/0;
	} catch (Exception e) {
    	logger.info("异常:"+e);
   	}
}
//此时return语句能够执行
	return  flag;
}

此时,事务是不会回滚的

解决try…catch事务回滚问题

###方法一:设置手动回滚
org.springframework.transaction.interceptor包下的类
TransactionAspectSupport.currentTransactionStatus()
.setRollbackOnly();

@Transactional(rollbackFor = Exception.class)
@Override
public Integer updateRecordOrdeNo(User user) {
	Integer flag = 0;
	try{
	   	 flag  = userMapper.save(user);
    	//出现异常
    	1/0;
	} catch (Exception e) {
    	logger.info("异常:"+e);
    	//设置手动回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
   	}
}
//此时return语句能够执行
	return  flag;
}

方法二:catch中抛出运行时异常

把异常抛出,就会被spring aop异常捕获到。

@Transactional(rollbackFor = Exception.class)
@Override
public Integer updateRecordOrdeNo(User user) {
	Integer flag = 0;
	try{
	   	 flag  = userMapper.save(user);
    	//出现异常
    	1/0;
	} catch (Exception e) {
    	logger.info("异常:"+e);
    	//catch中抛出运行时异常
		throw new RuntimeException(); 
   	}
}
//此时return语句能够执行
	return  flag;
}
  • 作者:LC超人在良家
  • 原文链接:https://blog.csdn.net/LC_Liangchao/article/details/122078261
    更新时间:2022-08-22 12:55:54