<4>Spring 中的 @Transactional 注解使用方法与含义

Spring 框架提供了一种声明式的事务管理方式,通过 @Transactional 注解来实现,通过注解的方式可以很方便地控制事务的边界以及事务的属性。使用注解的方式可以减少一系列系统级的配置,将事务的相关配置信息与业务逻辑相分离,提高了代码的可读性和可维护性。

<4> 注意事项和使用场景

在使用 @Transactional 注解时需要注意以下几点:

1. 事务的传播行为:可以通过 propagation 属性来设置事务的传播行为,默认为 REQUIRED,在方法内部调用其他带有 @Transactional 注解的方法时,会共用一个事务,如果内部方法抛出未捕获的异常,则整个事务会回滚。如果需要使用新的事务,可以设置 propagation 为 REQUIRES_NEW。

2. 事务的隔离级别:可以通过 isolation 属性来设置事务的隔离级别,默认为 DEFAULT,使用数据库默认的隔离级别。在并发访问的场景中需要关注事务的隔离级别,可以通过设置 isolation 为其他隔离级别来确保数据的一致性和隔离性要求。

3. 事务的只读属性:可以通过 readOnly 属性来设置事务是否只读,默认为 false。如果只读属性设置为 true,Spring 可以对事务进行一系列的优化,以提高性能和并发访问的能力。

4. 事务的超时属性:可以通过 timeout 属性来设置事务的超时时间,默认为 -1,表示没有超时限制。如果超过指定的超时时间事务仍未完成,则事务会被回滚。

<4> 演示示例代码

@Service
public class UserService {
    
    private final UserRepository userRepository;

    private final UserLogRepository userLogRepository;

    public UserService(UserRepository userRepository, UserLogRepository userLogRepository) {
        this.userRepository = userRepository;
        this.userLogRepository = userLogRepository;
    }

    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false, timeout = 10)
    public void createUser(User user) {
        try {
            userRepository.save(user);
            UserLog userLog = new UserLog(user.getId(), "Create user");
            userLogRepository.save(userLog);
        } catch (Exception e) {
            throw new RuntimeException("Failed to create user", e);
        }
    }
}
Java


上述代码示例中,在 UserService 类的 createUser 方法上使用了 @Transactional 注解,指定了事务的传播行为、隔离级别、只读属性和超时时间,方法内部的数据库操作都会被纳入这个事务中,如果有异常抛出,则整个事务会进行回滚。