欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > Spring Boot 中 `@Transactional` 注解使用示例

Spring Boot 中 `@Transactional` 注解使用示例

2025/6/17 9:05:49 来源:https://blog.csdn.net/exlink2012/article/details/141824523  浏览:    关键词:Spring Boot 中 `@Transactional` 注解使用示例

@Transactional 注解在 Spring Boot 中用于管理事务。它确保在方法执行过程中,所有数据库操作要么全部成功,要么全部回滚,以维护数据的一致性。下面是一些使用 @Transactional 的示例:

1. 在服务层使用 @Transactional

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Transactionalpublic void createUser(User user) {userRepository.save(user);// 其他数据库操作}
}

在上面的例子中,如果 createUser 方法中的任何数据库操作(如 save 方法)失败,所有已完成的操作都会被回滚。

2. 设置 @Transactional 的属性

你可以通过属性来定制事务的行为:

  • readOnly: 指定事务是否只读。用于优化查询性能。

  • rollbackFor: 指定哪些异常应该触发事务回滚。

  • propagation: 定义事务的传播行为(例如 REQUIREDREQUIRES_NEW 等)。

示例:

@Transactional(readOnly = true)
public List<User> getAllUsers() {return userRepository.findAll();
}@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public void updateUser(User user) throws Exception {userRepository.save(user);// 其他数据库操作if (someConditionFails()) {throw new Exception("更新失败");}
}
  • getAllUsers 方法被标记为只读事务,因此不允许对数据库进行修改。
  • updateUser 方法被配置为当抛出 Exception 时回滚,且即使当前已经存在事务,也会启动一个新的事务。

3. 事务回滚

默认情况下,@Transactional 只会在遇到 RuntimeException 时回滚事务。如果你想在 checked exception(如 IOException)时也回滚事务,可以指定 rollbackFor 属性:

@Transactional(rollbackFor = IOException.class)
public void someMethod() throws IOException {// 数据库操作if (someConditionFails()) {throw new IOException("IO异常,回滚事务");}
}

4. 自定义回滚条件

你可以基于自定义的逻辑回滚事务:

@Transactional
public void deleteUser(Long userId) {User user = userRepository.findById(userId).orElseThrow(() -> new RuntimeException("用户未找到"));userRepository.delete(user);if (someCustomCondition()) {TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();}
}

deleteUser 方法中,如果 someCustomCondition() 返回 true,则手动设置当前事务为回滚状态。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词