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

相关推荐
风象南5 小时前
很多人说,AI 让技术平权了,小白也能乱杀老师傅 ?
人工智能·后端
雨中飘荡的记忆6 小时前
ElasticJob分布式调度从入门到实战
java·后端
Se7en2587 小时前
推理平台全景
后端
大漠_w3cpluscom7 小时前
你学不会 CSS,不是笨,是方向错了
后端
cipher10 小时前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
毅航11 小时前
自然语言处理发展史:从规则、统计到深度学习
人工智能·后端
JxWang0511 小时前
Task04:字符串
后端
树獭叔叔12 小时前
10-让模型更小更聪明,学而不忘:知识蒸馏与持续学习
后端·aigc·openai
JxWang0512 小时前
Task02:链表
后端