事务
一、本地事务
1、事务的基本性质
2、事务的隔离级别
3、事务的传播行为
4、本地事务的坑
本地事务用法: 主启动类上添加@EnableTransactionManagement
开启本地事务,需要添加事务的类或者方法上添加@Transactional
,然后本地事务注解@Transactional(XXX)
中可以添加参数,例如rollbackFor = 异常名称.class
、propagation = Propagation.传播行为名称
、timeout=秒数(执行时间超过该秒数就要回滚)
等
前提: 同一个类中(添加了@Service,代表被spring管理,那就是单例的,一个类只有一个对象)有A、B两个方法,并且两个方法上面添加的都有@Transactional
事务注解,并且B方法上的事务注解中添加了参数propagation = Propagation.REQUIRES_NEW
,表示方法B使用新事务,也就是不和其他方法共用事务,虽然想法是好的,但是效果却不是这样
问题: 在如下代码中,当调用insertA方法时,如果insertB插入b表的时候有异常,能否保证insertA()中的a表插入成功,如果不能,应该如何修改?
分析: 虽然B方法上的事务注解中添加了参数propagation = Propagation.REQUIRES_NEW
,但是这个事务注解是不会起到效果的,因为在同一个对象中的A方法中调用B方法,那么相当于B方法中的代码直接就写在A方法中,那么说明B方法上是否添加事务注解都是无所谓的,有没有都不重要,也就是说明B方法完全被调用的时候完全使用A方法的事务注解,其实这和事务内部原理是有关系的,如果学习过JDK动态代理的朋友就会知道,它内部使用的就是类似于try catch
这种代码,所以A方法调用B方法,那是发生在同一个try{}
中的,也就是被一个事务管理,所以以上的说法是没有问题
解决: https://blog.csdn.net/qq_42449963/article/details/112982714,这是我之前看到的一个面试题,也是我写的博文,看就对了
二、分布式事务
1、为什么要有分布式事务
2、CAP定理与BASE理论
1、CAP定理
2、面临的问题
3、BASE理论
4、强一致性、弱一致性、最终一致性
3、分布式事务几种方案
1)、2PC模式
2)、柔性事务-TCC事务补偿型方案