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

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

1. 在服务层使用 @Transactional

java 复制代码
@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional
    public void createUser(User user) {
        userRepository.save(user);
        // 其他数据库操作
    }
}

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

2. 设置 @Transactional 的属性

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

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

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

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

示例:

java 复制代码
@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 属性:

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

4. 自定义回滚条件

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

java 复制代码
@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,则手动设置当前事务为回滚状态。

相关推荐
天天摸鱼的java工程师2 分钟前
RestTemplate 如何优化连接池?—— 八年 Java 开发的踩坑与优化指南
java·后端
一乐小哥3 分钟前
一口气同步10年豆瓣记录———豆瓣书影音同步 Notion分享 🚀
后端·python
LSTM976 分钟前
如何使用C#实现Excel和CSV互转:基于Spire.XLS for .NET的专业指南
后端
你我约定有三6 分钟前
java--泛型
java·开发语言·windows
三十_7 分钟前
【NestJS】构建可复用的数据存储模块 - 动态模块
前端·后端·nestjs
武子康9 分钟前
大数据-91 Spark广播变量:高效共享只读数据的最佳实践 RDD+Scala编程
大数据·后端·spark
努力的小郑9 分钟前
MySQL索引(二):覆盖索引、最左前缀原则与索引下推详解
后端·mysql
阿拉伦11 分钟前
智能交通拥堵治理柔性设计实践复盘小结
后端
用户40993225021211 分钟前
如何在 FastAPI 中优雅地模拟多模块集成测试?
后端·ai编程·trae
一枝花算不算浪漫12 分钟前
线上频繁FullGC?慌得一比!竟是Log4j2的这个“特性”坑了我
jvm·后端