春天中怎么创建事务

  介绍

这篇文章主要介绍了春天中怎么创建事务,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。

春天事务执行原理通过创建一个BeanFactoryTransactionAttributeSourceAdvisor,并把TransactionInterceptor注入进的去,而TransactionInterceptor实现了建议接口。而Spring Aop在春天中会把顾问中的建议转换成拦截器链,然后调用。

执行流程

<李>

获取对应事务属性,也就是获取@ transactional注解上的属性

<李>

获取TransactionManager,常用的如DataSourceTransactionManager事务管理

<李>

在目标方法执行前获取事务信息并创建事务

<李>

回调执行下一个调用链

<李>

一旦出现异常,尝试异常处理,回滚事务

<李>

提交事务

具体分析

获取对应事务属性,具体代码执行流程如下:

final  TransactionAttribute  txAttr =, getTransactionAttributeSource () .getTransactionAttribute(方法,targetClass); protected  TransactionAttribute  computeTransactionAttribute (Method 方法,Class<?祝辞,targetClass), {   ,//不要# 39;t  allow  no-public  methods  as 必需的。   ,//1只allowPublicMethodsOnly()返回真,只能是公共方法   ,if  (allowPublicMethodsOnly (),,,, ! Modifier.isPublic (method.getModifiers ())), {   return 才能;零;   ,}      ,//Ignore  CGLIB  subclasses 作用;introspect 从而actual  user 类。   ,Class<?祝辞,userClass =, ClassUtils.getUserClass (targetClass);//大敌;从而,method  may  be 提醒an 界面,,but  need  attributes 得到我方表示歉意,target 类。   ,//If 从而target  class  is 空,,,method  will  be 不变。   ,//方法代表接口中的方法,specificMethod代表实现类的方法   ,Method  specificMethod =, ClassUtils.getMostSpecificMethod(方法,userClass);   ,//If 断开连接,我方表示歉意dealing  with  method  with  generic 参数,find 从而original 方法。   ,//处理泛型=,,specificMethod  BridgeMethodResolver.findBridgedMethod (specificMethod);      ,//First  try  is 从而method 拷贝,target 类。   ,//查看方法中是否存在事务   ,TransactionAttribute  txAttr =, findTransactionAttribute (specificMethod);   ,if  (txAttr  !=, null), {   return 才能;txAttr;   ,}      ,//Second  try  is 从而transaction  attribute 提醒,target 类。   ,//查看方法所在类是否存在事务声明=,,txAttr  findTransactionAttribute (specificMethod.getDeclaringClass ());   ,if  (txAttr  !=, null ,,, ClassUtils.isUserLevelMethod(方法),{   return 才能;txAttr;   ,}      ,//如果存在接口,则在接口中查找   ,if  (specificMethod  !=,方法),{//才能,Fallback  is 用look  at 从而original 方法。//查才能找接口方法   时间=txAttr 才能;findTransactionAttribute(方法);   if 才能;(txAttr  !=, null), {   ,,return  txAttr;   ,,}//才能,Last  fallback  is 从而class  of 从而original 方法。//到才能接口类中寻找   时间=txAttr 才能;findTransactionAttribute (method.getDeclaringClass ());   if 才能;(txAttr  !=, null ,,, ClassUtils.isUserLevelMethod(方法),{   ,,return  txAttr;   ,,}   ,}      ,return 零;   }

getTransactionAttributeSource()获得的对象是在ProxyTransactionManagementConfiguration创建bean时注入的AnnotationTransactionAttributeSource对象。AnnotationTransactionAttributeSource中getTransactionAttributeSource方法主要逻辑交给了computeTransactionAttribute方法,所以我们直接看computeTransactionAttribute代码实现。

computeTransactionAttribute方法执行的逻辑是:

<李>

判断是不是只运行公共方法,在AnnotationTransactionAttributeSource构造方法中传入正确。若方法不是公共方法,则返回零。

<李>

得到具体的方法,方法方法可能是接口方法或者泛型方法。

<李>

查看方法上是否存在事务

<李>

查看方法所在类上是否存在事务

<李>

查看接口的方法是否存在事务,查看接口上是否存在事务。

春天中怎么创建事务