Spring 学习笔记(八) 声明式事务

声明式事务

Spring的事务机制

所有的数据访问技术都有事务处理机制,这些技术提供了API用来开启事务、提交事务来完成数据操作,或者在发生错误的时候回滚数据。

而Spring的事务机制是用统一的机制来处理不同数据访问技术的事务处理。

Spring的事务机制提供了一个PlatformTransactionManager接口,不同的数据访问技术的事务使用不同的接口实现。

这里写图片描述

这里以JPA为例:

1、在程序中定义事务管理器的代码:

这里写图片描述

这里写图片描述

2、声明式事务:

Spring 支持声明式事务,即使用注解来选择需要使用事务的方法,它使用@Transactional注解在方法上表明该方法需要事务支持。

这是一个基于AOP的实现操作,可以通过使用注解式的拦截方式来理解Spring的声明式事务。
被注解的方法在被调用时,Spring开启一个新的事务,当方法无异常运行结束后,Spring会提交这个事务。

这里写图片描述

在此处需要注意的是,此@Transactional注解来自org.springframework.transaction.annotation包,而不是javax.transaction。

这里写图片描述

Spring 提供了一个@EnableTransactionManagement注解在配置类上来开启声明式事务的支持。使用了@EnableTransactionManagement后,Spring容器会自动扫描注解@Transactional的方法和类。

这里写图片描述

注解事务行为:

@Transactional有很多的属性来定制事务行为

这里写图片描述

Propagation:

这个属性主要是用来声明事务的传播方式和定义事务的生命周期,默认情况下是REQUIRED。

这里写图片描述

Isolation:

这个属性主要用来决定事务的完整性,处理在多事务对相同数据下的处理机制,默认是DEFAULT,就是使用当前数据库的默认隔离级别:

Mysql:REPEATABLE_READ

Oracle、SQL Server:READ_COMMITTED

这里写图片描述

这里写图片描述

类级别使用@Transactional:

@Transactional 不仅可以注解在方法上,也可以注解在类上。当注解在类上的时候意味着此类的所有public方法都是开启事务的。

如果类级别和方法级别同时使用了@Transaction注解,则使用在方法级别的注解会重写类级别的注解。

Spring Data JPA的事务支持:

Spring Data JPA对所有的默认方法都开启了事务支持,且查询类事务默认启用readOnly=true属性。

关于这方面可以在SimpleJpaRepository的源码中可以看到:

这里写图片描述

首先:SimpleJpaRepository在类级别定义了@Transactional(readOnly = true)。

而在和save、delete相关的操作重写了@Transactional属性,此时readOnly属性是false,其余查询操作readOnly仍然为true。

这里写图片描述

Spring Boot的事务支持:

1、自动配置的事务管理器

1)在使用JDBC作为数据访问技术的时候,Spring Boot为我们定义了PlatformTransactionManager的实现DataSourceTransactionManager的Bean;

配置见org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration类中的定义:

这里写图片描述

2)在使用JPA作为数据访问技术的时候,Spring Boot为我们定义了一个PlatformTransactionManager的实现JpaTransactionManager的Bean。

配置见org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.class类中的定义。

这里写图片描述

2、自动开启注解事务的支持

Spring Boot 专门用于配置事务的类:org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
此配置类依赖于JpaBaseConfiguration和DataSourceTransactionManagerAutoConfiguration。

这里写图片描述

同时在org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration配置里还开启了对声明式事务的支持。

这里写图片描述

所以在Spring Boot中,无需显示开启使用@EnableTransactionManagement注解。

猜你喜欢

转载自blog.csdn.net/zxzzxzzxz123/article/details/70752897