1. 编程式事务处理:
Spring 提供编程式和声明式两种事务处理方式,我们首先通过一个编程式事务的小例子了解 Spring 中编程式事务处理的基本实现:
- //通过DefaultTransactionDefinition对象来持有事务处理属性
- TransactionDefinition td = new DefaultTransactionDefinition();
- //获取事务的状态
- TransactionStatus status = transactionManager.getTransaction(td);
- Try{
- //调用需要进行事务处理的目标方法
- }catch(ApplicationException e){
- //调用目标方法过程中产生异常,则对事务进行回滚处理
- transactionManager.rollback(status);
- throw e;
- }
- //成功调用目标方法之后,对事务进行提交处理
- transactionManager.commit(status);
- //通过DefaultTransactionDefinition对象来持有事务处理属性
- TransactionDefinition td = new DefaultTransactionDefinition();
- //获取事务的状态
- TransactionStatus status = transactionManager.getTransaction(td);
- Try{
- //调用需要进行事务处理的目标方法
- }catch(ApplicationException e){
- //调用目标方法过程中产生异常,则对事务进行回滚处理
- transactionManager.rollback(status);
- throw e;
- }
- //成功调用目标方法之后,对事务进行提交处理
- transactionManager.commit(status);
Spring 的声明式事务处理的即开即用特性为用户提供了很大的方便,在使用 Spring 时,我们绝大多数情况下还是使用其声明式事务处理。声明式事务处理涉及 Spring 框架对事务处理的统一管理,以及对并发事务和事务属性的处理,是一个比较复杂的过程,下面我们通过源码分析,了解 Spring 框架声明式事务处理功能的具体实现。
2. 事务的创建:
对 Spring 事务拦截器 TransactionInterceptor 回调方法 invoke 的源码分析中,我们了解到在进行事务处理前,首先根据是否是CallbackPreferringPlatformTransactionManager 类型的事务处理器分别 通过下面两个方法创建事务信息对象:
- TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
- TransactionInfo txInfo = prepareTransactionInfo(tm, txAttr, joinpointIdentification, status);
plaincopy
- TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
- TransactionInfo txInfo = prepareTransactionInfo(tm, txAttr, joinpointIdentification, status);
事务拦截器 TransactionInterceptor 回调方法 invoke 通过调用 TransactionAspectSupport 事务切面支持类中的 createTransactionIfNecessary 和prepareTransactionInfo 方法创建事务对象:
- //根据给定的事务属性创建事务对象
- protected TransactionInfo createTransactionIfNecessary(
- PlatformTransactionManager tm, TransactionAttribute txAttr, final String joinpointIdentification) {
- //读取事务方法调用的事务配置属性
- if (txAttr != null && txAttr.getName() == null) {
- //如果事务名称为null,则使用方法的名称(事务连接点标识)作为事务名称,
- //调用一个实现DelegatingTransactionAttribute接口的匿名内部类
- txAttr = new DelegatingTransactionAttribute(txAttr) {
- //使用方法名称作为事务名称
- public String getName() {
- return joinpointIdentification;
- }
- };
- }
- //事务状态封装了事务执行的状态信息
- TransactionStatus status = null;
- if (txAttr != null) {
- if (tm != null) {
- //事务处理器创建事务,并且返回当前事务的状态信息
- status = tm.getTransaction(txAttr);
- }
- else {
- if (logger.isDebugEnabled()) {
- logger.debug("Skipping transactional joinpoint [" + joinpointIdentification +
- "] because no transaction manager has been configured");
- }
- }
- }
- //准备事务信息,事务信息TransactionInfo封装了事务配置和状态信息
- return prepareTransactionInfo(tm, txAttr, joinpointIdentification, status);
- }
- //准备事务信息
- protected TransactionInfo prepareTransactionInfo(PlatformTransactionManager tm,
- TransactionAttribute txAttr, String joinpointIdentification, TransactionStatus status) {
- //创建事务信息对象
- TransactionInfo txInfo = new TransactionInfo(tm, txAttr, joinpointIdentification);
- //如果事务属性不为null,需要为方法使用事务
- if (txAttr != null) {
- if (logger.isTraceEnabled()) {
- logger.trace("Getting transaction for [" + txInfo.getJoinpointIdentification() + "]");
- }
- //为事务信息对象设置事务状态
- txInfo.newTransactionStatus(status);
- }
- //如果事务属性为null,不需要为方法使用事务
- else {
- if (logger.isTraceEnabled())
- logger.trace("Don't need to create transaction for [" + joinpointIdentification +
- "]: This method isn't transactional.");
- }
- //把当前创建的事务信息对象和线程绑定
- txInfo.bindToThread();
- return txInfo;
- }
plaincopy
- //根据给定的事务属性创建事务对象
- protected TransactionInfo createTransactionIfNecessary(
- PlatformTransactionManager tm, TransactionAttribute txAttr, final String joinpointIdentification) {
- //读取事务方法调用的事务配置属性
- if (txAttr != null && txAttr.getName() == null) {
- //如果事务名称为null,则使用方法的名称(事务连接点标识)作为事务名称,
- //调用一个实现DelegatingTransactionAttribute接口的匿名内部类
- txAttr = new DelegatingTransactionAttribute(txAttr) {
- //使用方法名称作为事务名称
- public String getName() {
- return joinpointIdentification;
- }
- };
- }
- //事务状态封装了事务执行的状态信息
- TransactionStatus status = null;
- if (txAttr != null) {
- if (tm != null) {
- //事务处理器创建事务,并且返回当前事务的状态信息
- status = tm.getTransaction(txAttr);
- }
- else {
- if (logger.isDebugEnabled()) {
- logger.debug("Skipping transactional joinpoint [" + joinpointIdentification +
- "] because no transaction manager has been configured");
- }
- }
- }
- //准备事务信息,事务信息TransactionInfo封装了事务配置和状态信息
- return prepareTransactionInfo(tm, txAttr, joinpointIdentification, status);
- }
- //准备事务信息
- protected TransactionInfo prepareTransactionInfo(PlatformTransactionManager tm,
- TransactionAttribute txAttr, String joinpointIdentification, TransactionStatus status) {
- //创建事务信息对象
- TransactionInfo txInfo = new TransactionInfo(tm, txAttr, joinpointIdentification);
- //如果事务属性不为null,需要为方法使用事务
- if (txAttr != null) {
- if (logger.isTraceEnabled()) {
- logger.trace("Getting transaction for [" + txInfo.getJoinpointIdentification() + "]");
- }
- //为事务信息对象设置事务状态
- txInfo.newTransactionStatus(status);
- }
- //如果事务属性为null,不需要为方法使用事务
- else {
- if (logger.isTraceEnabled())
- logger.trace("Don't need to create transaction for [" + joinpointIdentification +
- "]: This method isn't transactional.");
- }
- //把当前创建的事务信息对象和线程绑定
- txInfo.bindToThread();
- return txInfo;
- }
通过上面对 TransactionAspectSupport 事务切面支持类创建事务信息对象的源码分析,我们了解了在创建事务信息对象过程中创建事务状态,将创建的事务信息对象和当前线程资源绑定等基本的处理流程。在创建事务信息对象的方法中,事务处理器的 tm.getTransaction(txAttr); 是真正底层创建事务对象的方法,下面我们继续分析事务处理器创建事务对象的过程。
3. 抽象事务管理器 AbstractPlatformTransactionManager 获取事务:
抽象事务管理器 AbstractPlatformTransactionManager 提供了创建事务的模板,这个模板会被具体的事务处理器所使用,抽象事务管理器根据事务属性配置和当前线程绑定信息对事务是否需要创建以及如何创建进行一些通用的处理,然后把事务创建的底层细节交给具体的事务处理器实现。抽象事务管理器创建事务的模板方法如下:
- public final TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException {
- //doGetTransaction()方法是抽象方法,具体的实现由具体的事务处理器提供
- Object transaction = doGetTransaction();
- boolean debugEnabled = logger.isDebugEnabled();
- //如果没有配置事务属性,则使用默认的事务属性
- if (definition == null) {
- definition = new DefaultTransactionDefinition();
- }
- //检查当前线程是否存在事务
- if (isExistingTransaction(transaction)) {
- //处理已存在的事务
- return handleExistingTransaction(definition, transaction, debugEnabled);
- }
- //检查事务属性中timeout超时属性设置是否合理
- if (definition.getTimeout() < TransactionDefinition.TIMEOUT_DEFAULT) {
- throw new InvalidTimeoutException("Invalid transaction timeout", definition.getTimeout());
- }
- //对事务属性中配置的事务传播特性处理
- //如果事务传播特性配置的是mandatory,当前没有事务存在,抛出异常
- if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_MANDATORY) {
- throw new IllegalTransactionStateException(
- "No existing transaction found for transaction marked with propagation 'mandatory'");
- }
- //如果事务传播特性为required、required_new或nested
- else if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRED ||
- definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW ||
- definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) {
- SuspendedResourcesHolder suspendedResources = suspend(null);
- if (debugEnabled) {
- logger.debug("Creating new transaction with name [" + definition.getName() + "]: " + definition);
- }
- //创建事务
- try {
- //不激活和当前线程绑定的事务,因为事务传播特性配置要求创建新的事务
- boolean newSynchronization = (getTransactionSynchronization() != SYNCHRONIZATION_NEVER);
- //创建一个新的事务状态
- DefaultTransactionStatus status = newTransactionStatus(
- definition, transaction, true, newSynchronization, debugEnabled, suspendedResources);
- //创建事务的调用,具体实现由具体的事务处理器提供
- doBegin(transaction, definition);
- //初始化和同步事务状态
- prepareSynchronization(status, definition);
- return status;
- }
- catch (RuntimeException ex) {
- resume(null, suspendedResources);
- throw ex;
- }
- catch (Error err) {
- resume(null, suspendedResources);
- throw err;
- }
- }
- else {
- //创建空事务,针对supported类型的事务传播特性,激活和当前线程绑定的事务
- boolean newSynchronization = (getTransactionSynchronization() == SYNCHRONIZATION_ALWAYS);
- //准备事务状态
- return prepareTransactionStatus(definition, null, true, newSynchronization, debugEnabled, null);
- }
- }
- //准备事务状态
- protected final DefaultTransactionStatus prepareTransactionStatus(
- TransactionDefinition definition, Object transaction, boolean newTransaction,
- boolean newSynchronization, boolean debug, Object suspendedResources) {
- //创建事务状态
- DefaultTransactionStatus status = newTransactionStatus(
- definition, transaction, newTransaction, newSynchronization, debug, suspendedResources);
- //准备事务状态
- prepareSynchronization(status, definition);
- return status;
- }
- //创建事务状态
- protected DefaultTransactionStatus newTransactionStatus(
- TransactionDefinition definition, Object transaction, boolean newTransaction,
- boolean newSynchronization, boolean debug, Object suspendedResources) {
- //判断是否是新事务,如果是新事务,则需要把事务属性存放到当前线程中
- boolean actualNewSynchronization = newSynchronization &&
- !TransactionSynchronizationManager.isSynchronizationActive();
- return new DefaultTransactionStatus(
- transaction, newTransaction, actualNewSynchronization,
- definition.isReadOnly(), debug, suspendedResources);
- }
- //初始化事务属性
- protected void prepareSynchronization(DefaultTransactionStatus status, TransactionDefinition definition) {
- if (status.isNewSynchronization()) {
- //设置当前是否有活跃事务 TransactionSynchronizationManager.setActualTransactionActive(status.hasTransaction());
- //设置当前事务隔离级别 TransactionSynchronizationManager.setCurrentTransactionIsolationLevel(
- (definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) ?
- definition.getIsolationLevel() : null);
- TransactionSynchronizationManager.setCurrentTransactionReadOnly(definition.isReadOnly());
- //设置当前事务名称 TransactionSynchronizationManager.setCurrentTransactionName(definition.getName());
- TransactionSynchronizationManager.initSynchronization();
- }
- }
- public final TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException {
- //doGetTransaction()方法是抽象方法,具体的实现由具体的事务处理器提供
- Object transaction = doGetTransaction();
- boolean debugEnabled = logger.isDebugEnabled();
- //如果没有配置事务属性,则使用默认的事务属性
- if (definition == null) {
- definition = new DefaultTransactionDefinition();
- }
- //检查当前线程是否存在事务
- if (isExistingTransaction(transaction)) {
- //处理已存在的事务
- return handleExistingTransaction(definition, transaction, debugEnabled);
- }
- //检查事务属性中timeout超时属性设置是否合理
- if (definition.getTimeout() < TransactionDefinition.TIMEOUT_DEFAULT) {
- throw new InvalidTimeoutException("Invalid transaction timeout", definition.getTimeout());
- }
- //对事务属性中配置的事务传播特性处理
- //如果事务传播特性配置的是mandatory,当前没有事务存在,抛出异常
- if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_MANDATORY) {
- throw new IllegalTransactionStateException(
- "No existing transaction found for transaction marked with propagation 'mandatory'");
- }
- //如果事务传播特性为required、required_new或nested
- else if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRED ||
- definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW ||
- definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) {
- SuspendedResourcesHolder suspendedResources = suspend(null);
- if (debugEnabled) {
- logger.debug("Creating new transaction with name [" + definition.getName() + "]: " + definition);
- }
- //创建事务
- try {
- //不激活和当前线程绑定的事务,因为事务传播特性配置要求创建新的事务
- boolean newSynchronization = (getTransactionSynchronization() != SYNCHRONIZATION_NEVER);
- //创建一个新的事务状态
- DefaultTransactionStatus status = newTransactionStatus(
- definition, transaction, true, newSynchronization, debugEnabled, suspendedResources);
- //创建事务的调用,具体实现由具体的事务处理器提供
- doBegin(transaction, definition);
- //初始化和同步事务状态
- prepareSynchronization(status, definition);
- return status;
- }
- catch (RuntimeException ex) {
- resume(null, suspendedResources);
- throw ex;
- }
- catch (Error err) {
- resume(null, suspendedResources);
- throw err;
- }
- }
- else {
- //创建空事务,针对supported类型的事务传播特性,激活和当前线程绑定的事务
- boolean newSynchronization = (getTransactionSynchronization() == SYNCHRONIZATION_ALWAYS);
- //准备事务状态
- return prepareTransactionStatus(definition, null, true, newSynchronization, debugEnabled, null);
- }
- }
- //准备事务状态
- protected final DefaultTransactionStatus prepareTransactionStatus(
- TransactionDefinition definition, Object transaction, boolean newTransaction,
- boolean newSynchronization, boolean debug, Object suspendedResources) {
- //创建事务状态
- DefaultTransactionStatus status = newTransactionStatus(
- definition, transaction, newTransaction, newSynchronization, debug, suspendedResources);
- //准备事务状态
- prepareSynchronization(status, definition);
- return status;
- }
- //创建事务状态
- protected DefaultTransactionStatus newTransactionStatus(
- TransactionDefinition definition, Object transaction, boolean newTransaction,
- boolean newSynchronization, boolean debug, Object suspendedResources) {
- //判断是否是新事务,如果是新事务,则需要把事务属性存放到当前线程中
- boolean actualNewSynchronization = newSynchronization &&
- !TransactionSynchronizationManager.isSynchronizationActive();
- return new DefaultTransactionStatus(
- transaction, newTransaction, actualNewSynchronization,
- definition.isReadOnly(), debug, suspendedResources);
- }
- //初始化事务属性
- protected void prepareSynchronization(DefaultTransactionStatus status, TransactionDefinition definition) {
- if (status.isNewSynchronization()) {
- //设置当前是否有活跃事务 TransactionSynchronizationManager.setActualTransactionActive(status.hasTransaction());
- //设置当前事务隔离级别 TransactionSynchronizationManager.setCurrentTransactionIsolationLevel(
- (definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) ?
- definition.getIsolationLevel() : null);
- TransactionSynchronizationManager.setCurrentTransactionReadOnly(definition.isReadOnly());
- //设置当前事务名称 TransactionSynchronizationManager.setCurrentTransactionName(definition.getName());
- TransactionSynchronizationManager.initSynchronization();
- }
- }
通过对上面创建事务对象的源码分析,我们看到这抽象事务管理器获取事务对象的这个模板方法主要功能是处理事务属性中配置的事务传播特性,对于判断是否存在事务的 isExistingTransaction 方法和创建事务对象的 doBegin 方法,均委派给具体的事务处理器实现。
4. 抽象事务管理器 AbstractPlatformTransactionManager 处理已存在的事务:
对于新事务的处理相对比较简单,只需根据事务属性配置创建,同时将事务隔离级别等属性保存到事务绑定的线程资源中。而对于已存在的事务处理相对比较复杂一些,在抽象事务管理器 AbstractPlatformTransactionManager 中通过 handleExistingTransaction 方法来处理已存在的事务:
- private TransactionStatus handleExistingTransaction(
- TransactionDefinition definition, Object transaction, boolean debugEnabled)
- throws TransactionException {
- //如果事务传播特性为:never,则抛出异常
- if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NEVER) {
- throw new IllegalTransactionStateException(
- "Existing transaction found for transaction marked with propagation 'never'");
- }
- //如果事务传播特性是not_supported,同时当前线程存在事务,则将事务挂起
- if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NOT_SUPPORTED) {
- if (debugEnabled) {
- logger.debug("Suspending current transaction");
- }
- //挂起事务
- Object suspendedResources = suspend(transaction);
- boolean newSynchronization = (getTransactionSynchronization() == SYNCHRONIZATION_ALWAYS);
- //创建非事务的事务状态,让方法非事务地执行
- return prepareTransactionStatus(
- definition, null, false, newSynchronization, debugEnabled, suspendedResources);
- }
- //如果事务传播特性是required_new,则创建新事务,同时把当前线程中存在的
- //事务挂起
- if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW) {
- if (debugEnabled) {
- logger.debug("Suspending current transaction, creating new transaction with name [" +
- definition.getName() + "]");
- }
- //挂起已存在的事务
- SuspendedResourcesHolder suspendedResources = suspend(transaction);
- try {
- boolean newSynchronization = (getTransactionSynchronization() != SYNCHRONIZATION_NEVER);
- //将挂起的事务状态保存起来
- DefaultTransactionStatus status = newTransactionStatus(
- definition, transaction, true, newSynchronization, debugEnabled, suspendedResources);
- //创建新事务
- doBegin(transaction, definition);
- prepareSynchronization(status, definition);
- return status;
- }
- catch (RuntimeException beginEx) {
- resumeAfterBeginException(transaction, suspendedResources, beginEx);
- throw beginEx;
- }
- catch (Error beginErr) {
- resumeAfterBeginException(transaction, suspendedResources, beginErr);
- throw beginErr;
- }
- }
- //如果事务传播特性是nested嵌套事务
- if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) {
- //如果不允许事务嵌套,则抛出异常
-