目录
零、Spring事务大致流程。
一般我们使用注解方式@Transitional,那么Spring容器首先会提取事务标签:
1、查看方法中是否存在事务声明;有则返回
2、否则,查看方法所在类中是否存在事务声明;有则返回
3、否则,如果存在接口,则到接口中去寻找;有则返回
拿到注解信息后就会解析详细的属性信息。
声明式事务处理主要步骤:
a、获取事务属性;只有存在事务属性一切才可谈,否则其他功能无从谈起。
b、加载配置中配置的TransactionManager 。
c、不同事务处理方式使用不同的逻辑。
d、在目标方法执行前获取事务并收集事务信息。
事务信息和事务属性-也就是TransitionInfo和TransitionAttribute并不相同,TransitionInfo包含TransitionAttribute信息,但是除了TransitionAttribute外还有其他事务信息,如:PlatformTransactionManager以及TransitionStatus相关信息。
e、执行目标方法。
f、一旦出现异常,尝试异常处理。默认回滚运行时异常。
g、提交事务前的事务信息清楚。
h、提交事务。
一、代码层面。
Spring中定义了其中事务传播行为:
TransactionDefinition中定义如下
//传播机制 必须在一个事务内运行有则加入当前事务执行,否则创建新的事务执行
int PROPAGATION_REQUIRED = 0;
//传播机制 支持事务:有则加入当前事务,没有则以非事务运行
int PROPAGATION_SUPPORTS = 1;
//传播机制 强制:有则加入当前事务,没有则抛出异常
int PROPAGATION_MANDATORY = 2;
//传播机制 创建一个新事务,如果当前存在事务,则将当前事务挂起
int PROPAGATION_REQUIRES_NEW = 3;
//传播机制 以非事务方式运行,如果存在则挂起当前事务
int PROPAGATION_NOT_SUPPORTED = 4;
//传播机制 以非事务方式运行,如果存在则抛出异常
int PROPAGATION_NEVER = 5;
//传播机制 如果当前存