整体流程
事务是使用SpringAop的原理去实现的
- 开启@EnableTransactionManagement注解
- 引入TransactionManagementConfigurationSelector.class这个类
- 加载AutoProxyRegistrar.class,ProxyTransactionManagementConfiguration.class两个对象
- 注册 InfrastructureAdvisorAutoProxyCreator.class这个对象,它是BeanPostProcessor的子类,beanid是org.springframework.aop.config.internalAutoProxyCreator,Bean对象在初始化之后都会判断是否需要生成代理类对象(根据是否有加上@Transactional注解)
- 将ProxyTransactionManagementConfiguration配置类中的对象注册到ioc容器中,其中注册了TransactionInterceptor事务拦截器
- TransactionInterceptor是MethodInterceptor(Aop)的子类,也属于Aop中的一个链
- 当springAop链调用的时候,会执行到TransactionInterceptor的invoke方法
类图:
spring事务拦截器的方法
protected Object invokeWithinTransaction(Method method, @Nullable Class<?> targetClass,
final InvocationCallback invocation) throws Throwable {
// If the transaction attribute is null, the method is non-transactional.
TransactionAttributeSource tas = getTransactionAttributeSource();
final TransactionAttribute txAttr = (tas != null ? tas.getTransactionAttribute(method, targetClass) : null);
final PlatformTransactionManager tm = determineTransactionManager(txAttr);
final String joinpointIdentification = methodIdentification(method, targetClass, txAttr);
if (txAttr == null || !(tm instanceof CallbackPreferringPlatformTransactionManager)) {
// Standard transaction demarcation with getTransaction and commit/rollback calls.
TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
Object retVal = null;
try {
//执行目标方法
retVal = invocation.proceedWithInvocation();
}
catch (Throwable ex) {
// 如果有异常就会进行回滚操作
completeTransactionAfterThrowing(txInfo, ex);
throw ex;
}
finally {
cleanupTransactionInfo(txInfo);
}
//没有异常就会提交事务
commitTransactionAfterReturning(txInfo);
return retVal;
}
}
事务失效
如果service 没有将异常抛出的时候,上面这个方法没有捕获到异常,就会正常的提交事务
参考:蚂蚁课堂