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

相关推荐
dadaobusi2 小时前
学习:RV lkvm SBI
java·学习·spring
HEJOO94 小时前
深入理解 Java volatile 关键字:原理、用法与常见误区
java·开发语言·spring
曹牧4 小时前
Java:no content to map due to end of input
java·开发语言
阿维的博客日记4 小时前
Example 类全场景实战指南
java·mybatis
两点王爷4 小时前
SpringBoot 项目集成 GeoServer 源码,实现地图服务发布
java·spring boot·后端
Javatutouhouduan5 小时前
Java如何速通性能优化难题?
java·java面试·jvm调优·后端开发·java程序员·java八股文·java性能优化
lemon_sjdk5 小时前
DOM 节点
java·前端·javascript
leoZ2315 小时前
2026-09-09-springboot-cloud-deploy-pitfalls
java·前端·javascript·vue.js·人工智能·spring boot·后端
驭渊的小故事6 小时前
多线程02
java·开发语言·jvm
随遇而安zx6 小时前
【多线程】---实战:CompletableFuture编排
java·多线程·并发