spring tx

1 InfrastructureAdvisorAutoProxyCreator:BeanPostProcessor
2 BeanFactoryTransactionAttributeSourceAdvisor:PointcutAdvisor,持有3和4
3 AnnotationTransactionAttributeSource: 解析和缓存方法和类上的Transactional注解
4 TransactionInterceptor: MethodInterceptor,Advice

1 在postProcessAfterInitialization时找到beanFactory内的2,2的Pointcut是否匹配呢,2的ClassFilter没问题,2的MethodMatcher(注意这里需遍历Class内各方法,任一方法匹配即可)查看3内是否存在Transactional注解(缓存查找或解析),最后决定2是否作为代理Advisor一员,无Advisor列表不代理,否则创建代理,创建ProxyFactory并调用其getProxy方法(内部创建了DefaultAopProxyFactory,dapf根据多个因素判断创建JdkDynamicAopProxy还是CglibAopProxy,JdkDynamicAopProxy调用Proxy.newProxyInstance生成代理对象),JdkDynamicAopProxy本身作为InvocationHandler,其invoke方法内根据Advisor列表构建最后的Advice(MethodInterceptor)列表(注意此时已有确定的方法,MethodMatcher匹配一下), 构建ReflectiveMethodInvocation并在其内调用各MethodInterceptor和最后的方法调用,其中TransactionInterceptor在内进行事务操作

默认只在Error与RuntimeException下回滚(DefaultTransactionAttribute)
在这里插入图片描述
@Transactional 失效:
1 调用当前类的@Transactional 方法
无论jdk还是cglib代理都存在代理对象和原始对象,即内层方法是原始对象调用的
只要有一个方法需要代理,都会生成代理对象,即导致所有方法都是在代理对象上调用
2 非public方法
3 catch了异常,导致无法回滚
4 传播行为或rollbackFor 导致未开启或不回滚

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值