spring事务传播机制

一般java层面,简单基础理论的问答。从多个博客自己理解整理一下,加深印象。

为什么会有传播机制?

spring 对事务的控制,是使用 aop 切面实现的,我们不用关心事务的开始,提交 ,回滚,只需要在方法上加@Transactional注解,这时候就有问题了。

场景一: serviceA 方法调用了 serviceB 方法,但两个方法都有事务,这个时候如果 serviceB 方法异常,是让 serviceB 方法提交,还是两个一起回滚。

场景二:serviceA 方法调用了 serviceB 方法,但是只有 serviceA 方法加了事务,是否把 serviceB 也加入 serviceA 的事务,如果 serviceB 异常,是否回滚 serviceA 。

场景三:serviceA 方法调用了 serviceB 方法,两者都有事务,serviceB 已经正常执行完,但 serviceA 异常,是否需要回滚 serviceB 的数据。

spring定义了7中事务传播机制


REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED)

支持当前事务,如果没有事务会创建一个新的事务

默认级别 

记忆点:有 ---》     无---》创建

SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS)

支持当前事务,如果没有事务的话以非事务方式执行

记忆点:有 ---》     无---》

MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY)

支持当前事务,如果没有事务抛出异常

记忆点:有 ---》     无---》error

REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW)

创建一个新的事务并挂起当前事务

记忆点:有 ---》创建     无---》创建

NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED)

以非事务方式执行,如果当前存在事务则将当前事务挂起

记忆点:有 ---》无     无---》

NEVER(TransactionDefinition.PROPAGATION_NEVER)

以非事务方式进行,如果存在事务则抛出异常

记忆点:有 ---》error     无---》

NESTED(TransactionDefinition.PROPAGATION_NESTED)

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

记忆点:有 --->     无---》创建    有嵌套

springboot设置事务传播的地方

隔离级别隔离级别是指若干个并发的事务之间的隔离程度,与我们开发时候主要相关的场景包括:脏读取、重复读、幻读
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。