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

相关推荐
Frostnova丶2 小时前
LeetCode 190.颠倒二进制位
java·算法·leetcode
闻哥2 小时前
Redis事务详解
java·数据库·spring boot·redis·缓存·面试
hrhcode2 小时前
【Netty】五.ByteBuf内存管理深度剖析
java·后端·spring·springboot·netty
道亦无名3 小时前
aiPbMgrSendAck
java·网络·数据库
发现你走远了3 小时前
Windows 下手动安装java JDK 21 并配置环境变量(详细记录)
java·开发语言·windows
心 -3 小时前
java八股文DI
java
NEXT063 小时前
后端跑路了怎么办?前端工程师用 Mock.js 自救实录
前端·后端·程序员
泯泷3 小时前
提示工程的悖论:为什么与 AI 对话比你想象的更难
人工智能·后端·openai
黎雁·泠崖4 小时前
Java常用类核心详解(一):Math 类超细讲解
java·开发语言
大尚来也4 小时前
跨平台全局键盘监听实战:基于 JNativeHook 在 Java 中捕获 Linux 键盘事件
java·linux