@Transcational

张开发
2026/6/7 21:17:32 15 分钟阅读
@Transcational
Transcational 是 Spring 中声明式事务管理的注解通俗来讲就是用了 Transcational 当 sql 语句每条执行后遇到错误不会回滚但是用了这个歌注解之后 sql 会回滚一般用法Service public class OrderService { Autowired private OrderMapper orderMapper; Autowired private StockMapper stockMapper; Transactional // 开启事务 public void createOrder(Order order) { // 1. 保存订单 orderMapper.insert(order); // 2. 扣减库存 stockMapper.deduct(order.getProductId(), order.getQuantity()); // 3. 如果这里抛出异常订单和库存都会回滚 } }事务传播行为最常用的配置传播级别值说明使用场景REQUIRED默认有事务就用当前的没有就新建大部分业务方法REQUIRES_NEW总是新建挂起当前事务新建一个独立事务日志记录、独立子任务SUPPORTS有就用没有就不用不需要事务的方法只读查询MANDATORY必须有事务强制要求调用方有事务核心业务方法NOT_SUPPORTED不用事务挂起当前事务非关键操作NEVER必须没有事务禁止在事务中执行某些特殊操作NESTED嵌套事务内层事务回滚不影响外层批量处理部分回滚Transactional // 默认 REQUIRED public void methodA() { // 有事务 methodB(); // 会加入 methodA 的事务 } Transactional(propagation Propagation.REQUIRES_NEW) public void methodB() { // 新建独立事务methodA 的回滚不影响 methodB }事务隔离级别隔离级别脏读不可重复读幻读说明READ_UNCOMMITTED✅✅✅读未提交最低READ_COMMITTED❌✅✅读已提交Oracle默认REPEATABLE_READ❌❌✅可重复读MySQL默认SERIALIZABLE❌❌❌串行化最高最慢// 默认RuntimeException 和 Error 触发回滚Exception受检异常不触发 Transactional public void method() { // SQLException 不会触发回滚 } // 指定回滚的异常类型 Transactional(rollbackFor Exception.class) // 所有异常都回滚 public void method() { // SQLException 也会触发回滚 } // 指定不回滚的异常 Transactional(noRollbackFor IllegalArgumentException.class) public void method() { // IllegalArgumentException 不会触发回滚 }常见陷阱陷阱说明解决方案同类方法调用无效同一个类中无事务方法调用事务方法事务不生效注入自身或把方法分开private 方法无效Transactional不能用在 private 方法上使用 public异常被 catch 了自己 catch 异常后不抛出事务不回滚重新抛出或手动回滚数据库引擎不支持MyISAM 引擎不支持事务使用 InnoDB

更多文章