说说“Spring事务”

Spring事务简介

Spring框架是一个轻量级的、用于Java企业级应用程序开发的框架。其中,Spring提供了对事务的支持,使得开发者可以在程序中方便地实现事务管理,从而确保应用程序的数据一致性和完整性。

Spring事务的实现方式 Spring提供了两种事务管理方式:

  1. 编程式事务管理
  2. 声明式事务管理

编程式事务管理 编程式事务管理允许用户在代码中精确定义事务的边界。在此模式下,开发者需要手动获取和释放连接、手动开始和提交事务等,从而控制事务的边界。Spring提供了TransactionTemplate和PlatformTransactionManager两个类来支持编程式事务管理。

  • TransactionTemplate: 封装了一些常见的事务操作方法,如执行数据库操作并提交事务、执行数据库操作但不提交事务等,可以大大简化编程式事务管理的代码量。
  • PlatformTransactionManager: 事务管理器接口,它包含了开始事务、提交事务、回滚事务等方法的定义。Spring提供了多种事务管理器实现,例如DataSourceTransactionManager、HibernateTransactionManager、JpaTransactionManager等,以适应不同的数据源和持久化框架。

声明式事务管理 声明式事务管理是Spring事务最常用、最推荐使用的一种方式。在此模式下,开发者使用Spring的AOP技术将事务关注点从业务逻辑代码中剥离出来,形成独立的事务切面,通过指定事务切面的配置来控制事务的边界。具体而言,开发者需要完成以下三个步骤:

  1. 在Spring配置文件中声明TransactionManager,用于管理事务;
  2. 在业务逻辑方法上加上@Transactional注解,表明该方法需要开启事务;
  3. 根据需求设置@Transactional注解的各个属性,如隔离级别、回滚规则等。

相对于编程式事务管理,声明式事务管理更加简洁明了,而且可以将事务管理和业务逻辑代码分离出来,提高代码的可读性和可维护性。

Spring框架支持多种事务隔离级别,具体如下

  • DEFAULT:使用底层数据库的默认隔离级别。
  • READ_UNCOMMITTED:允许读取未提交的数据变更,存在脏读、幻读和不可重复读的问题。
  • READ_COMMITTED:只允许读取已提交的数据变更,避免脏读,但是可能存在幻读和不可重复读的问题。
  • REPEATABLE_READ:保证同一事务范围内多次读取数据的结果相同,避免了脏读和不可重复读,但是仍然可能存在幻读的问题。
  • SERIALIZABLE:最高的隔离级别,强制事务串行执行,避免脏读、不可重复读和幻读问题。

可以通过@Transactional注解的isolation属性来指定使用哪种隔离级别。如果不指定,默认使用DEFAULT级别。

可以在@Transactional注解中通过 isoloation 属性指定事务的隔离级别,如:

@Transactional(isolation = Isolation.READ_COMMITTED)
public void updateUserBalance(String userId, BigDecimal amount) {
    // ...
}

Spring事务传播行为是指在多个事务方法相互调用的场景中,如何处理这些事务之间的关系。Spring提供了7种事务传播行为,具体如下:

  • REQUIRED(默认):若当前存在事务,则加入该事务;否则新建一个事务并在自己的事务范围内执行。
  • SUPPORTS:若当前存在事务,就加入该事务;否则以非事务方式执行。
  • MANDATORY:必须在一个已存在的事务中执行,否则抛出异常。
  • REQUIRES_NEW:必须开启一个新事务执行,如果当前存在事务,则挂起当前事务。
  • NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则挂起当前事务。
  • NEVER:以非事务方式执行操作,如果当前存在事务,则抛出异常。
  • NESTED:若当前存在事务,则嵌套在该事务中执行;否则新建一个事务并在自己的事务范围内执行。

可以在@Transactional注解中通过 propagation 属性指定事务的传播行为,默认为REQUIRED。例如:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateUserBalance(String userId, BigDecimal amount) {
    // ...
}

Spring事务管理中的隔离级别和传播行为可以同时用。在使用@Transactional注解时,可以同时指定isolation和propagation属性,示例如下:

@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRES_NEW)
public void updateUserBalance(String userId, BigDecimal amount) {
    // ...
}

以上代码指定了事务隔离级别为READ_COMMITTED,传播行为为REQUIRES_NEW。这表示在调用这个方法时,将会创建一个新的事务,且该事务的隔离级别为READ_COMMITTED。

需要注意的是,不同的隔离级别和传播行为会对事务产生不同的影响,需要根据具体业务场景来选择合适的隔离级别和传播行为,确保数据的一致性和正确性。

猜你喜欢

转载自blog.csdn.net/samsung_samsung/article/details/130368717