首页 > 其他分享 >TransactionTemplate的工作原理

TransactionTemplate的工作原理

时间:2023-01-09 21:12:19浏览次数:31  
标签:status return dataSource 工作 DataSourceTransactionManager ex 原理 TransactionTempla

1 初始化

DataSourceTransactionManagerAutoConfiguration.JdbcTransactionManagerConfiguration#transactionManager()会创建transactionManagerbean对象:

@Bean  
@ConditionalOnMissingBean(TransactionManager.class)  
DataSourceTransactionManager transactionManager(Environment environment, DataSource dataSource,  
      ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) {  
   DataSourceTransactionManager transactionManager = createTransactionManager(environment, dataSource);  
   transactionManagerCustomizers.ifAvailable((customizers) -> customizers.customize(transactionManager));  
   return transactionManager;  
}

它会创建JdbcTransactionManagerDataSourceTransactionManager实现类:

private DataSourceTransactionManager createTransactionManager(Environment environment, DataSource dataSource) {  
   return environment.getProperty("spring.dao.exceptiontranslation.enabled", Boolean.class, Boolean.TRUE)  
         ? new JdbcTransactionManager(dataSource) : new DataSourceTransactionManager(dataSource);  
}

TransactionAutoConfiguration.TransactionTemplateConfiguration#transactionTemplate()会创建transactionTemplatebean对象,将上述transactionManager注入:

@Bean  
@ConditionalOnMissingBean(TransactionOperations.class)  
public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {  
   return new TransactionTemplate(transactionManager);  
}

2 事务管理流程

通过TransactionTemplate#execute()方法可以进行编程式事务管理,其内部会调用transactionManager进行获取事务、提交事务和回滚事务:

public <T> T execute(TransactionCallback<T> action) throws TransactionException {  
   Assert.state(this.transactionManager != null, "No PlatformTransactionManager set");  
  
   if (this.transactionManager instanceof CallbackPreferringPlatformTransactionManager) {  
      // WebSphereUowTransactionManager事务管理流程
      return ((CallbackPreferringPlatformTransactionManager) this.transactionManager).execute(this, action);  
   }  
   else {  
      // 获取事务
      TransactionStatus status = this.transactionManager.getTransaction(this);  
      T result;  
      try {  
         // 执行业务方法
         result = action.doInTransaction(status);  
      }  
      // 回滚事务:RuntimeException/Error/Throwable异常才会回滚
      catch (RuntimeException | Error ex) {  
         rollbackOnException(status, ex);  
         throw ex;  
      }  
      catch (Throwable ex) {  
         // Transactional code threw unexpected exception -> rollback  
         rollbackOnException(status, ex);  
         throw new UndeclaredThrowableException(ex, "TransactionCallback threw undeclared checked exception");  
      }  
      // 提交事务
      this.transactionManager.commit(status);  
      return result;  
   }  
}

标签:status,return,dataSource,工作,DataSourceTransactionManager,ex,原理,TransactionTempla
From: https://www.cnblogs.com/Xianhuii/p/17038531.html

相关文章

  • 优秀的工作流引擎144个特点
    作为一名工作流引擎开发者、爱好者、探索者整理优秀的工作流引擎特点,分享给各位,欢迎借鉴、指导、使用驰骋工作流引擎。一般性功能(GeneralFunctions)​1.免程序开发(NoP......
  • 一文了解 Dubbo 3 配置工作原理
    以下是一个Dubbo属性配置的例子dubbo-spring-boot-samples##application.properties#Springbootapplicationspring.application.name=dubbo-externalized-......
  • 【算法原理】矩阵乘法
    【算法原理】矩阵乘法一般是矩阵乘法+快速幂,结合\(dp\)普通矩阵乘法:矩阵乘法有结合律,无交换律。因此在计算一长串矩阵相乘的时候,可以依据计算难度选择计算顺序,从而......
  • 【Python】使用os模块设置工作路径和添加环境变量
    查看和设置工作路径importosprint(os.getcwd())#显示当前路径os.chdir('./example/path')#更改路径,''里面为更改的路径print(os.getcwd())#显示当前路径......
  • Java工作流详解(附6大工作流框架对比)​
    ​目录​1.什么是工作流​2.工作流应用场景​3.工作流实现方式​4.有哪些工作流框架?​5.1.Activiti6.2.Flowable7.3.Camunda8.4.jBPM9.5.osworkflow,6.jflow.​10.工作流......
  • 两款开源.NET工作流引擎 Elsa 与ccflow使用比较
    ​相对java开源的工作流程引擎.net开源的工作流程引擎相对较少,这里整理两款.net开源工作流引擎,做一下对比使用。elsa示例代码:Githubd地址:https://github.com/zhenl/MyElsac......
  • Apache Spark + 海豚调度:PB 级数据调度挑战,教你如何构建高效离线工作流
    2010年,我国进入移动互联网,数据规模成几何式增长。在大数据开源技术领域,以Hadoop为核心的大数据生态系统面对海量数据也不断发展与迭代,大数据处理流程中的各个开源组件,也一起......
  • C++ std::function 实现原理
    msvc预备知识参数类型,可以分为一元(unary)和二元(binary),这个概念很重要,gcc的实现里也用到。可以看到msvc里定义了三个_Arg_types:无参数类型;接受一个参数,一元;接受两个参......
  • Charles抓包原理
    一、Charles抓包原理图   客户端向服务器发起HTTPS请求Charles拦截客户端的请求,伪装成客户端向服务器进行请求服务器向“客户端”(实际上是Charles)返回服务器的......
  • 机器学习16:简单, 直观的方法理解CNN(卷积神经网络)核心原理及实现
    1.CNN(卷积神经网络)的典型应用场景1.1WaveNet模型:​​https://deepmind.com/blog/wavenet-generative-model-raw-audio/​​如果你能训练人工智能机器人唱歌,干嘛还训练它......