文章

@Transcation 事务注解

@Transcation 事务注解

关于事务注解 @Transcation 的使用, 以及事务的介绍

在 Spring Boot 中,@Transactional 注解用于声明方法或类的事务特性。事务是一种机制,确保一系列操作要么全部成功,要么全部失败,从而保证数据的一致性和完整性。

@Transactional 注解的作用

@Transactional 注解通常用于业务层的服务方法上,它可以管理方法中的事务边界。注解在方法或类上使用时,可以控制数据库操作的提交和回滚。

注解的属性

@Transactional 提供了一些属性来配置事务的行为。常用的属性包括:

  1. propagation:事务的传播行为,默认值是 Propagation.REQUIRED
  2. isolation:事务的隔离级别,默认值是 Isolation.DEFAULT
  3. timeout:事务超时,默认值是 -1(表示没有超时)。
  4. readOnly:事务是否为只读,默认值是 false
  5. rollbackFor:触发回滚的异常类型,默认值是 RuntimeException
  6. noRollbackFor:不触发回滚的异常类型。

示例分析

1
2
3
4
5
6
7
8
@Service
public class MyService {

    @Transactional(rollbackFor = Exception.class)
    public void myTransactionalMethod() {
        // 方法体
    }
}

在这个示例中,@Transactional(rollbackFor = Exception.class) 作用在 myTransactionalMethod 方法上。

rollbackFor 属性

  • rollbackFor = Exception.class:指定在遇到 Exception 类的异常时回滚事务。默认情况下,只有 RuntimeException 或其子类会触发事务回滚,通过指定 rollbackFor = Exception.class,可以确保即使遇到非 RuntimeException(例如 checked exception),事务也会回滚。

事务传播行为(propagation)

事务传播行为定义了在遇到已经存在的事务时,新的事务应该如何进行。常见的传播行为有:

  1. REQUIRED(默认值):如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  2. REQUIRES_NEW:总是创建一个新的事务。如果当前存在事务,则将当前事务挂起。
  3. SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。
  4. NOT_SUPPORTED:总是以非事务方式执行。如果当前存在事务,则将当前事务挂起。
  5. MANDATORY:必须在事务中执行。如果当前没有事务,则抛出异常。
  6. NEVER:必须在非事务中执行。如果当前存在事务,则抛出异常。
  7. NESTED:如果当前存在事务,则创建一个事务嵌套在当前事务中;如果当前没有事务,则创建一个新的事务。

事务隔离级别(isolation)

事务隔离级别控制并发事务之间的行为。常见的隔离级别有:

  1. DEFAULT:使用底层数据库的默认隔离级别。
  2. READ_UNCOMMITTED:允许读取未提交的数据,可能会出现脏读。
  3. READ_COMMITTED:只能读取已提交的数据,防止脏读。
  4. REPEATABLE_READ:确保在整个事务期间,数据的读取是一致的,防止不可重复读。
  5. SERIALIZABLE:最高的隔离级别,完全隔离事务,防止脏读、不可重复读和幻读。

使用示例

假设我们有一个简单的用户服务,包含一个添加用户的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional(rollbackFor = Exception.class)
    public void addUser(User user) {
        userRepository.save(user);
        // 如果这里抛出任何异常,事务会回滚
        if (someCondition) {
            throw new Exception("Some exception");
        }
    }
}

在这个示例中,如果 addUser 方法在保存用户后抛出任何异常,事务将回滚,userRepository.save(user) 的操作也会被撤销。

总结

通过使用 @Transactional 注解,Spring Boot 可以为方法或类管理事务边界,确保数据的一致性和完整性。rollbackFor 属性允许开发者指定哪些异常会触发事务回滚,从而提供更细粒度的控制。理解和正确配置事务特性对于构建健壮的应用程序至关重要。

本文由作者按照 CC BY 4.0 进行授权