Spring框架学习[Spring事务处理的实现](七)

2014-11-24 03:00:34 · 作者: · 浏览: 3
ion, false, newSynchronization, debugEnabled, null); }

5.事务的挂起:

如果当前线程存在事务,但事务传播特性又要求开启新事务时,需要将已有的事务进行挂起,事务的挂起涉及线程与事务信息的保存,实现源码如下:

[java] view plaincopyprint protected final SuspendedResourcesHolder suspend(Object transaction) throws TransactionException { //如果事务是激活的,且当前线程事务同步机制也是激活状态 if (TransactionSynchronizationManager.isSynchronizationActive()) { //挂起当前线程中所有同步的事务 List suspendedSynchronizations = doSuspendSynchronization(); try { Object suspendedResources = null; //把挂起事务的操作交由具体的事务处理器处理 if (transaction != null) { suspendedResources = doSuspend(transaction); } //在线程中保存与事务处理有关的信息,并将线程里有关的线程局部变量重置 String name = TransactionSynchronizationManager.getCurrentTransactionName(); //重置当前线程中事务相关的线程局部变量 TransactionSynchronizationManager.setCurrentTransactionName(null); boolean readOnly = TransactionSynchronizationManager.isCurrentTransactionReadOnly(); TransactionSynchronizationManager.setCurrentTransactionReadOnly(false); Integer isolationLevel = TransactionSynchronizationManager.getCurrentTransactionIsolationLevel(); TransactionSynchronizationManager.setCurrentTransactionIsolationLevel(null); boolean wasActive = TransactionSynchronizationManager.isActualTransactionActive(); TransactionSynchronizationManager.setActualTransactionActive(false); //将当前线程中事务相关信息保存 return new SuspendedResourcesHolder( suspendedResources, suspendedSynchronizations, name, readOnly, isolationLevel, wasActive); } //对事务挂起操作中产生异常和错误的处理 catch (RuntimeException ex) { doResumeSynchronization(suspendedSynchronizations); throw ex; } catch (Error err) { doResumeSynchronization(suspendedSynchronizations); throw err; } } //如果事务是激活的,但是事务同步机制不是激活的,则只需要保存事务状态,不 //需要重置事务相关的线程局部变量 else if (transaction != null) { Object suspendedResources = doSuspend(transaction); return new SuspendedResourcesHolder(suspendedResources); } //事务和事务同步机制都不是激活的,则不要想处理 else { return null; } }