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 导致未开启或不回滚

Spring TX事务管理是Spring框架提供的一种管理事务的机制。Spring并不直接管理事务,而是通过提供多种事务管理器,将事务管理的职责委托给底层的持久化机制(如Hibernate或JTA等)来实现。 在Spring进行事务管理时,主要有两种方式:编程式事务管理和声明式事务管理。声明式事务管理是一种常用的方式,它通过使用注解或配置文件的方式来定义事务的边界和行为。 要使用Spring事务管理,首先需要引入相关的库。然后,根据具体的需求,可以使用注解式的方式来管理事务。例如,可以在需要进行事务管理的方法或类上添加@Transactional注解,该注解会自动处理事务的开启、提交或回滚等操作。 下面是一个使用Spring事务管理的示例代码: ```java package org.example; import org.example.service.AccountService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Starter01 { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring01.xml"); AccountService accountService = (AccountService) applicationContext.getBean("accountService"); accountService.transfer(1, 100.0, 2); } } ``` 以上是一个简单的示例,它演示了如何使用注解方式来管理Spring事务。在该示例中,通过获取ApplicationContext来获取AccountService bean,并调用其transfer方法来完成事务操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值