Spring Boot的事务管理实战(附源码 超详细)
觉得有帮助请点赞关注收藏~~~
学过数据库课程的小伙伴们应该对事务比较熟悉,常见的有两阶段锁等等
从org.springframework.data.jpa.repository.support.SimpleJpaRepository的源代码中可以看出,Spring Data JPA对所有的默认接口方法都开启了事务支持,并且对查询类事务默认启用只读权限(read only)
在Spring Boot中 自动配置了事务管理器 并自动开启了注解事务的支持
1:自动配置的事务管理器
在使用JDBC访问数据库使,Spring Boot定义了DataSourceTransactionManager的Bean,具体配置见org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration类中的定义
@Bean
@ConditionalOnMissBean(PlatformTransactionManager.class)
public DataSourceTransactionManager transactionManager(DataSourceProperties properties)
{
DataSourceTransactionManager transactionManager=new DataSourceTransactionManager(this.dataSource);
if(this.transactionManagerCustomizers!=null)
{
this.transactionManagerCustomizers.customize(transactionManager);;
}
return transactionManager;
}
在使用JPA访问数据库时,Spring Boot定义了PlatformTransactionManager的实现JpaTransactionManager的Bean 定义如下
@Bean
@ConditionalOnMissBean
public PlatformTransactionManager transactionManager()
{
JpaTransactionManager transactionManager=new JpaTransactionManager();
if(this.transactionManagerCustomizers!=null)
{
this.transactionManagerCustomizers.customize(transactionManager);;
}
return transactionManager;
}
2:自动开启注解事务的支持
Spring Boot使用org.springframework.boot.autoconfigure.transaction.Transaction-AutoConfiguration类配置事务的支持,并在该类中自动开启注解事务的支持 代码如下
@Configuration
@ConditionalOnBean(PlatformTransactionManager.class)
@ConditionalOnMissingBean(AbstracTransactionManagementConfiguration.class)
public static class EnableTransactionManagementConfiguration{
}
不过自动启用该自动注解有两个前提条件,但是一般情况下这两个条件都是满足的 所以在启动类上写不写这两个注解都可以开启事务的支持,然后使用@Transactional注解处理事务