欢迎浏览我的博客 获取更多精彩文章
https://boyn.top
数据库的事务管理一直是一个难点,在如今并发量越来越大的情况下,数据库在多事务访问的环境中容易引发数据丢失和一些数据一致性的问题.而事务管理就是为了解决这些问题的.在大部分情况下,我们要求一系列的数据库操作是保持原子性的,即要么全部成功,要么全部失败,但是也会有其他的要求和需要.在Spring中,事务的传播行为就可以很好地满足我们不停变化的需要.
在Spring的应用中,有着编程式事务和声明式事务两种管理方式
TransactionTemplate是Spring提供的事务管理器的模板,它提供的是编程式的事务管理,他的执行逻辑如下:
在Spring中,编程式的事务管理已经很少用到了,目前主流的方式是使用@Transactional注解来进行声明式事务的实现.
首先,我们需要声明一个TransactionManager的Bean
@Bean("transactionManager")
public PlatformTransactionManager annotationDrivenTransactionManager(){
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
此处是在一个配置类里面声明的,还需要再加上一个@EnableTransactionManagement的类注解
这样Spring就会知道要使用这个事务管理器来管理事务了
这个注解是开启Spring事务管理的关键,我们先来看一下他的接口配置项
在其中,最重要的就是isolation和propagation
其中牵涉到了数据库的事务特性,会在稍后讲述
有了上面的这些东西,我们就可以在Spring中对数据库事务进行管理了.不过首先,我们需要知道,声明式事务的流程是怎么样的
Spring通过PlatformTransactionManager的子类作为事务管理器来创建事务,与此同时,会将我们设置的隔离级别等属性往事务上面配置.我们只需要完成配置,而无需指定运行的方式.
在数据库执行的事务过程中,最重要的是4个基本要素
其中,隔离性的级别又被分为4层,分别是:
一般来说,从脏读到序列化,性能是一路下降的,在大部分时间,我们都可以选择读写提交的隔离级别来完成大部分的操作,但是也会在一定情况下带来数据的一致性问题
同时,隔离性的不同,也会带来传播行为的不同.当一个事务发生了失败的时候,跟这一个事务有关的其他事务要根据什么逻辑去处理这个回滚,这就是传播行为的策略.在Spring中,一共有7种传播行为