问题描述
请教一下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对应的就是这个意思。至于更深的,你只能进入源码看了。