这些感想,就不用理论和概念描述了

事务:一系列引起数据改变的操作捆绑在一起,所有操作都成功,整个事务才提交;有一个操作失败,整个事务回滚。

spring事务:如果持久层框架选择的是hibernate,在spring与hibernate集成并配置由spring管理事务之后, 那么实际上是spring事务管理hibernate事务,而hibernate事务管理jdbc事务,最后jdbc事务管理数据库事务,所以我们用的是spring管理的事务,最后却达到了数据库事务的效果。

savepoint:保存点。就是把一个事务分成若干保存点,可以选择回滚到其中的某个保存点,而不必整个事务都回滚。

springboot jpa opencsv 数据库备份还原_hibernate

spring事务传播范围:说两个理解思路。

PROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务。
PROPAGATION_SUPPORTS -- 支持当前事务,如果当前没有事务,就以非事务方式执行。
从字面理解,required,需要,就是需要有事务,如果已经有事务了,那么就使用这个事务,如果还没有事务,就新建一个事务,总之会有事务,因为需要。

supports,支持,这个支持力度就小一些,如果已经有事务了,那么就使用这个事务,如果还没有事务,那就拉倒,因为只是支持已经存在的事务,没有就没有。

然后事务如何传播?

现在有3个方法,method1(m1)里有事务t1,method2(m2)里有事务t2,method3(m3)调用m1和m2,那么现在事务是怎样的?

当m1,m2,m3都配置到spring事务拦截上(所有事务拦截都是相同的传播范围,都是REQUIRED或SUPPORTS)

springboot jpa opencsv 数据库备份还原_spring_02

当m1,m2配置到spring事务拦截上,m3不在拦截上(所有事务拦截都是相同的传播范围,都是REQUIRED或SUPPORTS)

springboot jpa opencsv 数据库备份还原_spring_03

由此发现,如果所有拦截的事务都是SUPPORTS的传播范围,则其实相当于没有事务,

因为SUPPORTS只是支持当前事务,如果一直没有事务,它就一直没有事务可以支持。

现在讨论不同的拦截对象和不同的传播范围,

当m1,m2配置到spring事务拦截上,m3不在拦截上(m1的范围是REQUIRED,m2的范围是SUPPORTS)

springboot jpa opencsv 数据库备份还原_hibernate_04

当m1,m2,m3都配置到spring事务拦截上(m1,m3的范围是REQUIRED,m2的范围是SUPPORTS)

springboot jpa opencsv 数据库备份还原_hibernate_05