springboot(17)事务


Spring Boot 提供了一种简单的方式来管理事务。Spring Boot 应用使用 Spring Data JPA 或 Spring JDBC Template 进行持久化时,可以轻松地添加事务管理。

Spring Boot 提供了一种简单的方式来管理事务。Spring Boot 应用使用 Spring Data JPA 或 Spring JDBC Template 进行持久化时,可以轻松地添加事务管理。

1. @Transactional

在Spring Boot中,我们可以使用 @Transactional 注解来管理事务,这个注解可以被用在类或方法上。当这个注解被用在类上时,它会应用到所有方法上。如果它被用在方法上,那么它只会应用到这个方法上。

2.@Transactional使用注意事项

  • @Transactional 注解只能应用于 public 方法上,因为使用了 Spring AOP 代理机制,只有这样才能被代理。
  • 默认情况下,只有未检查异常会导致事务回滚。如果需要回滚受检异常,需要在注解中设置 rollbackFor 属性。
  • Spring Boot 中默认的传播行为是 REQUIRED,这意味着如果当前没有事务,就创建一个新事务;如果已经有事务了,就加入到当前事务中。
  • 在使用嵌套事务时,需要注意数据库是否支持该功能。
  • 在使用 Spring Boot 与 JPA 进行事务管理时,要注意 EntityManager 的生命周期,以避免在事务外使用 EntityManager 导致数据不一致。

3. 基本属性

事务有四个基本属性:传播行为、隔离级别、超时时间和只读标识。Spring Boot 中的 @Transactional 注解提供了默认值,但是我们也可以通过设置这些属性来自定义事务。

4. 传播行为

Spring Boot 支持以下传播行为:

  • REQUIRED:如果当前没有事务,就创建一个新事务;如果已经有事务了,就加入到当前事务中。
  • REQUIRES_NEW:创建一个新事务,如果当前已经有事务了,就把当前事务挂起。
  • SUPPORTS:如果当前有事务,就加入到当前事务中;如果当前没有事务,就以非事务的方式执行。
  • MANDATORY:如果当前有事务,就加入到当前事务中;否则抛出异常。
  • NOT_SUPPORTED:以非事务的方式执行操作,如果当前有事务,就把当前事务挂起。
  • NEVER:以非事务的方式执行操作,如果当前有事务,就抛出异常。
  • NESTED:如果当前有事务,就在嵌套事务中执行;如果当前没有事务,就创建一个新事务。

5. 隔离级别

Spring Boot 支持以下隔离级别:

  • DEFAULT:使用默认的隔离级别。
  • READ_UNCOMMITTED:允许读取未提交的数据。
  • READ_COMMITTED:只允许读取已提交的数据。
  • REPEATABLE_READ:保证在同一个事务中多次读取数据的结果是一致的。
  • SERIALIZABLE:完全串行化所有事务,开销最大,最可靠。

超时时间指的是事务执行的最长时间,如果超过这个时间,事务就会自动回滚。

只读标识指的是事务是否只读,如果设置为只读,那么事务期间不能对数据库进行修改操作。

以上就是 Spring Boot 中事务的基本概念和用法。

6. @Transactional 注解的例子

6.1 例子一

以下是一个使用 @Transactional 注解的例子:

@Service
public class UserServiceImpl implements UserService {
    
    

    @Autowired
    private UserRepository userRepository;

    @Override
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false, timeout = 30)
    public void saveUser(User user) {
    
    
        userRepository.save(user);
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false, timeout = 30)
    public void updateUser(User user) {
    
    
        userRepository.save(user);
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false, timeout = 30)
    public void deleteUser(User user) {
    
    
        userRepository.delete(user);
    }

}

在上面的例子中,我们使用了 @Transactional 注解来管理事务。对于每个方法,我们都指定了传播行为(REQUIRED)、隔离级别(DEFAULT)、超时时间(30 秒)和只读标识(false)。这些属性可以根据需要进行更改。

6.2 例子二

@GetMapping("/insert")
    @Transactional(rollbackFor = Exception.class)
    public String insert(User user) {
    
    
        testService.insert(user);
        user.setAge(user.getAge()++);
        testService.update(user);
        return user.getName();
    }

这是一个在 Spring Boot 应用程序中使用 @Transactional 注解的示例。@Transactional 注解用于管理事务。在这个例子中,@Transactional 注解被应用于 insert 方法上。它指定了 rollbackFor 属性,以便在抛出 Exception 异常时回滚事务。 testService.insert(user) 插入了一个新的 User 对象,并将其保存到数据库。user.setAge(user.getAge()++) 修改了 User 对象的年龄属性。testService.update(user) 更新了 User 对象的数据库记录。最后,insert 方法返回 User 对象的名称。

在 Spring Boot 的 @Transactional 注解中,rollbackFor 属性用于指定事务在哪些异常发生时需要回滚。如果抛出的异常类型是 rollbackFor 属性中指定的异常类型之一,则事务将回滚。相反,noRollbackFor 属性用于指定哪些异常类型不应该导致事务回滚。如果抛出的异常类型是 noRollbackFor 属性中指定的异常类型之一,则事务将不会回滚。如果未指定 rollbackFor 或 noRollbackFor 属性,则事务将根据异常类型自动判断是否回滚,通常只有未检查异常会导致事务回滚。

7. 总结

Spring Boot 提供了一种简单的方式来管理事务:使用 @Transactional 注解。该注解可以被用在类或方法上,可指定传播行为、隔离级别、超时时间和只读标识等属性。Spring Boot 中支持的传播行为包括:REQUIRED、REQUIRES_NEW、SUPPORTS、MANDATORY、NOT_SUPPORTED、NEVER、NESTED。支持的隔离级别包括:DEFAULT、READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE。超时时间指的是事务执行的最长时间,只读标识表示事务是否只读。@Transactional 注解中的 rollbackFor 属性用于指定事务在哪些异常发生时需要回滚。如果抛出的异常类型是 rollbackFor 属性中指定的异常类型之一,则事务将回滚。相反,noRollbackFor 属性用于指定哪些异常类型不应该导致事务回滚。如果抛出的异常类型是 noRollbackFor 属性中指定的异常类型之一,则事务将不会回滚。如果未指定 rollbackFornoRollbackFor 属性,则事务将根据异常类型自动判断是否回滚,通常只有未检查异常会导致事务回滚。

总的来说,Spring Boot 中事务的使用非常方便,只需要使用 @Transactional 注解即可。同时,Spring Boot 还提供了丰富的属性配置,可以根据需要进行自定义配置。

猜你喜欢

转载自blog.csdn.net/Bilal_0/article/details/129990186
今日推荐