SpringBoot事务回滚@Transaction注解

本文详细介绍了SpringBoot中@Transactional注解使用时需要注意的事项,包括权限、容器管理、内部调用、异常类型等。强调了@Transactional只对 RuntimeException 进行回滚的特性,并提供了手动回滚事务的示例。同时,还展示了如何通过指定rollbackFor参数来处理Exception类型的异常回滚。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot事务回滚@Transaction

需要注意的几个事项:

1.注解@Transactional配置的方法非public权限修饰;
2.注解@Transactional所在类非Spring容器管理的bean;
3.注解@Transactional所在类中,注解修饰的方法被类内部方法调用;
4.业务代码抛出异常类型非RuntimeException,事务失效;
5.业务代码中存在异常时,使用try…catch…语句块捕获,而catch语句块没有throw new RuntimeExecption异常;(最难被排查到问题且容易忽略)
6.注解@Transactional中Propagation属性值设置错误即Propagation.NOT_SUPPORTED(一般不会设置此种传播机制)
7.mysql关系型数据库,且存储引擎是MyISAM而非InnoDB,则事务会不起作用(基本开发中不会遇到);

我们使用该注解的时候,大家初期使用的时候肯定不知道其原理,该注解只针对RuntimeException的异常进行回滚,示例代码如下

	@Transactional
	public void testTranscational() {
		try {
			mapper.insertUser("用户");
			mapper.insertOrder("订单");
		} catch (Exception e) {
			throw new RuntimeException();
		}
	}
   

** 因为@Transactional这个注解只会在RuntimeException(运行时异常),这种异常时才会进行数据回滚 **


二.我们可以进行手工进行回滚操作,示例代码如下

	@Transactional
	public void testTranscational() {
		try {
			mapper.insertUser("用户");
			mapper.insertOrder("订单");
		} catch (Exception e) {
			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
		}
	}

** 当方法的异常被捕捉时,进行手工回滚 **


三.我们可以声明异常类型去捕捉进行回滚,我们想他报Exception异常的时候依旧想他进行数据回滚要怎么办。只需要在@Transactional后面加上(rollbackFor = Exception.class),就行了,示例代码如下

    @Transactional(rollbackFor = Exception.class)
	public void testTranscational() {
		try {
			mapper.insertUser("用户");
			mapper.insertOrder("订单");
		} catch (Exception e) {
			e.printStackTrace();;
		}
	}

**当捕捉到Exception异常时,事务注解会生效,进行回滚 **

### Spring Boot 事务回滚机制 在 Spring Boot 中,`@Transactional` 注解用于声明式事务管理。当方法被标记为此注解时,Spring 将创建一个代理对象来控制事务边界并处理异常情况。 如果目标方法内发生未被捕获的 `RuntimeException` 或其子类,则默认情况下会触发事务回滚[^1]。对于受检异常,默认不会引发回滚行为;但是可以通过设置属性来自定义这一规则: #### 自动回滚配置 为了实现更精细的控制,可以调整 `rollbackFor` 和 `noRollbackFor` 属性指定哪些类型的异常应该引起或不引起回滚: ```java @Override @Transactional( rollbackFor = {SQLException.class, DataAccessException.class}, noRollbackFor = IllegalArgumentException.class ) public void processTransaction() { // 方法体... } ``` 上述例子表明任何由 SQL 执行失败引起的异常都将导致事务回滚,而非法参数异常则不会影响已有的更改提交给数据库[^3]。 #### 显式编程方式 除了依赖于自动检测之外,还可以通过编程手段显式地标记当前事务状态为需要回滚的状态。这通常是在捕获特定业务逻辑错误之后完成的操作: ```java import org.springframework.transaction.annotation.Transactional; import javax.persistence.PersistenceException; @Service class OrderService { private final EntityManager entityManager; @Autowired public OrderService(EntityManager entityManager) { this.entityManager = entityManager; } @Transactional public void placeOrder(Order order) throws Exception { try { validate(order); saveOrder(order); } catch (BusinessRuleViolationException ex) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); throw new OrderPlacementFailedException("订单放置失败", ex); } } private void validate(Order order){ if(!order.isValid()){ throw new BusinessRuleViolationException("无效订单"); } } private void saveOrder(Order order){ entityManager.persist(order); } } ``` 在这个案例里,一旦遇到违反商业规则的情况就会立即请求回滚整个事务,并且重新抛出自定义的应用程序级别异常以便进一步处理[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值