Spring Boot 使用JPA @Transactional 报错事务不回滚

本文详细探讨了在Spring框架中使用@Transactional注解进行事务管理时遇到的问题及解决方法。通过对比org.springframework.transaction.annotation.Transactional与javax.transaction.Transactional的区别,分享了一种在特定条件下确保事务正确回滚的配置策略。

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

@Transactional有两个包:

1、org.springframework.transaction.annotation.Transactional;

2、javax.transaction.Transactional;

两个过都试过了,但service层方法上报错后jpa.save方法仍然插入了数据到DB中,没有回滚,看用的mysql(5.7版本)中引擎要是InnoDB才能支持事务,查看了也确实是InnoDB。后来加了如下配置后,事务生效了:

# application.yml

spring:

 jpa: 

 database-platform: org.hibernate.dialect.MySQL5InnoDBDialect #InnoDB才能支持事务

或者

# application.xml
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
 

再贴下我的事务配置(org.springframework.transaction.annotation.Transactional)

@Transactional(propagation = Propagation.SUPPORTS, readOnly = false, rollbackFor = Exception.class)

参照:https://blog.youkuaiyun.com/equaker/article/details/81534922

### Spring BootJPA `@Transactional` 注解的意义 在Spring Boot应用程序中,`@Transactional`注解用于管理事务。这确保了多个数据库操作作为一个整体执行,在这个过程中任何单个操作失败都将导致整个事务回滚,从而保持数据一致性和完整性[^3]。 ### 使用场景 当涉及到持久化对象的状态更改时,比如保存、更新或删除实体实例,这些动作通常需要在一个事务范围内完成。对于只读查询,默认情况下需要显式声明事务边界;然而,为了优化性能或者处理特定情况下的并发控制,也可以为只读操作加上此注解并设置相应的属性。 ### 如何启用事务支持 要使`@Transactional`起作用,必须先配置好JPA或JDBC的数据源,并且激活事务管理功能。可以通过添加`@EnableTransactionManagement`到配置类上来做到这一点,过大多数时候只需依赖默认配置即可,特别是在基于Java Config的方式下开发的应用程序里[^1]。 ### 基本用法 #### 类级别标注 将`@Transactional`放在服务层组件之上意味着该类中的所有公共方法都会自动参与事务管理: ```java @Service @Transactional public class UserService { private final UserRepository userRepository; public UserService(UserRepository userRepository) { this.userRepository = userRepository; } public User createUser(String name, String email){ var user = new User(name,email); return userRepository.save(user); } } ``` #### 方法级别标注 更常见的是针对具体的方法使用`@Transactional`,以便更加精确地定义哪些业务逻辑应当受到保护: ```java @Service public class OrderService { @Autowired private OrderRepository orderRepo; @Transactional public void placeOrder(OrderDetails details){ // 创建订单记录... OrderEntity entity = convertToEntity(details); try{ orderRepo.save(entity); // 模拟其他必要的业务流程... }catch(Exception e){ throw new RuntimeException("Failed to process order",e); } } } ``` 需要注意的是,如果一个带有`@Transactional`标记的方法是从同一个bean内部调用另一个同样带有所述注解的方法,则外部的事务上下文可能会按预期工作,这是因为Spring AOP代理机制的缘故[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值