<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);
        }
    }
}


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