Spring ResourceHolder的问题

问题描述

请教一下ResourceHolderSupport中的synchronizedWithTransaction的作用是什么?设置的地方有2处:1、DataSourceTransactionManager.doBegin()时,会设置txObject.getConnectionHolder().setSynchronizedWithTransaction(true);2、DataSourceUtils.doGetConnection()时,如果TransactionSynchronizationManager.isSynchronizationActive()为true会设置holderToUse.setSynchronizedWithTransaction(true);取值的地方也有2处:1、DataSourceTransactionManager.doBegin()中,首先会进行下面的判断:if (txObject.getConnectionHolder() == null ||txObject.getConnectionHolder().isSynchronizedWithTransaction())2、DataSourceUtils.doGetConnection()中,也会做下面的判断:if (conHolder != null && (conHolder.hasConnection() || conHolder.isSynchronizedWithTransaction())) ~~~~~~~~~~~~~~~始终没有能完全理解synchronizedWithTransaction究竟代表什么含义?是表示当前的数据库连接是否处于事务管理之中??那在什么情况下,conHolder.hasConnection()会返回false呢?多谢! 问题补充:谢谢diaozhanming 的回复。Spring事务部分源码断断续续读过。总体的逻辑应该还好,细节部分就不是很清晰。我觉得主要是缺少一个总体上的概念(或者说这个总体的概念有点太粗放了,不够细致)或者说停留在,知其然,不知其所以然的地步。比如下面的一些概念,就需要仔细梳理清楚:TransactionStatus.isNewTransaction().isNewSynchronization()TransactionObject.hasConnectionHolder().hasTransaction().isNewConnectionHolder()ConnectionHolder.isSynchronizedWithTransaction().hasConnection().isTransactionActive()PlatformTransactionManager.transactionSynchronization.rollbackOnCommitFailure.isExistingTransaction().suspend()TransactionSynchronizationManager.isSynchronizationActive().isActualTransactionActive().SYNCHRONIZATION_ALWAYS

解决方案

这个判断的意思是说是关于事物的传播的,判断是否需要必须开启一个新的事物,还是说说如果前一个方法已经有一个事物了,则直接使用已有的事物。true和false对应的就是这个意思。至于更深的,你只能进入源码看了。

时间: 2024-09-19 09:03:38

Spring ResourceHolder的问题的相关文章

MOM系列文章之 - Spring Jms Integration 解读

       前阵子对Spring Jms实现进行了一些扩展,借此机会系统化地研究了一下Spring对JMS的支持,整理成文,希望大家能够喜欢!        本文打算从两个维度(编程API和包结构)进行阐述,希望大家读完,能对Spring在JMS层面上做的事情有一个大致了解.当然喜欢扣细节的朋友,也欢迎提出你的疑惑!     第一部分:编程API        首先,让我们来看下Spring中我们最最经常用到的JmsTemplate,上图                            

深入解析Java的Spring框架中的混合事务与bean的区分_java

混合事务在ORM框架的事务管理器的事务内,使用JdbcTemplate执行SQL是不会纳入事务管理的. 下面进行源码分析,看为什么必须要在DataSourceTransactionManager的事务内使用JdbcTemplate. 1.开启事务DataSourceTransactionManager protected void doBegin(Object transaction,TransactionDefinition definition) { DataSourceTransactio

Spring事务超时时间可能存在的错误认识

1.先看代码 1.1.spring-config.xml Java代码   <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">       <property name="driverClassName" value="com.mysql.jdbc.Driver"/>    

Spring.Net在Mvc4.0中应用的说明

案例Demo:http://yunpan.cn/cJ5aZrm7Uybi3 访问密码 414b Spring.Net在Mvc4.0中应用的说明 1.引用dll       2.修改Global文件 (SpringMvcApplication)       3.控制器添加属性     4.WebConfig配置   <!--必须紧跟着configuration之后-->   <configSections>     <sectionGroup name="spring

Spring MVC中的MultiActionController用法详解

Spring MVC 中 Controller 的层次实在是多,有些眼花缭乱了 .在单个的基础上,再新加两三个叫做丰富,再多就未必是好事, 反而会令人缩手新闻片脚,无从定夺.多数 Controller 都是只完 成一个任务,不过也有一个像 Struts 的 DispatchAction 的那样 的 Conntroller, org.springframework.web.servlet.mvc.multiaction.MultiActio nController,意即在一个 Controller

Spring实现动态数据源,支持动态添加、删除和设置权重及读写分离

当项目慢慢变大,访问量也慢慢变大的时候,就难免的要使用多个数据源和设置读写分离了. 在开题之前先说明下,因为项目多是使用Spring,因此以下说到某些操作可能会依赖于Spring. 在我经历过的项目中,见过比较多的读写分离处理方式,主要分为两步: 1.对于开发人员,要求serivce类的方法名必须遵守规范,读操作以query.get等开头,写操作以update.delete开头. 2.配置一个拦截器,依据方法名判断是读操作还是写操作,设置相应的数据源. 以上做法能实现最简单的读写分离,但相应的也

第一章 Spring介绍

1.1.Spring是什么 官网首页是这样解释的:Springis the most popular application development framework for enterpriseJava. Millions of developers use Spring to create high performing,easily testable, reusable code without any lock-in. Spring是一个开源框架,Spring是于2003年兴起的一个轻

Docker with Spring Boot

前段时间在我厂卷爷的指导下将Docker在我的实际项目中落地,最近几个小demo都尽量熟悉docker的使用,希望通过这篇文章分享我截止目前的使用经验(如有不准确的表述,欢迎帮我指出).本文的主要内容是关于Java应用程序的docker化,首先简单介绍了docker和docker-compose,然后利用两个案例进行实践说明. 简单说说Docker,现在云计算领域火得一塌糊涂的就是它了吧.Docker的出现是为了解决PaaS的问题:运行环境与具体的语言版本.项目路径强关联,因此干脆利用lxc技术

《Spring技术内幕》——1.1节Spring的各个子项目

第1章 Spring的设计理念和整体架构 横看成岭侧成峰,远近高低各不同. 不识庐山真面目,只缘身在此山中. -[宋]苏轼<题西林壁> 本章内容 Spring的各个子项目 Spring的设计目标 Spring的整体架构 Spring的应用场景 1.1 Spring的各个子项目 打开Spring社区网站http://www.springsource.org, 我们可以看到围绕Spring核心构建出的一个丰富的平台生态系统.在这个平台生态系统中,除了Spring本身,还有许多值得注意的子项目.对S