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

相关推荐
非凡ghost7 分钟前
HWiNFO(专业系统信息检测工具)
前端·javascript·后端
非凡ghost9 分钟前
FireAlpaca(免费数字绘图软件)
前端·javascript·后端
ekkcole11 分钟前
java把word转pdf使用jar包maven依赖
java·pdf·word
非凡ghost16 分钟前
Sucrose Wallpaper Engine(动态壁纸管理工具)
前端·javascript·后端
Java小王子呀19 分钟前
Java实现Excel转PDF
java·pdf·excel
间彧19 分钟前
从零到一搭建Spring Cloud Alibbaba项目
后端
楼田莉子21 分钟前
C++学习:C++11关于类型的处理
开发语言·c++·后端·学习
LSTM9724 分钟前
使用 Java 对 PDF 添加水印:提升文档安全与版权保护
后端
该用户已不存在25 分钟前
Gemini CLI 扩展,把Nano Banana 搬到终端
前端·后端·ai编程
用户2986985301427 分钟前
Spire.Doc 实践指南:将Word 文档转换为 XML
后端·.net