Spring事务处理的实现: Spring与事务

版权声明: https://blog.csdn.net/qq1641530151/article/details/83386750

通过对于书上代码的学习和了解,本书并没有将事务最底层的实现完全展现出来。因为这是涉及到很复杂的操作系统的一些操作,比如对于线程的管理,以及ThreaLocal变量的一些维护等等。这些可以说对我们这些用户是不可见的。书上的代码只是将整个执行的流程给我们展现了出来,让我们可以比较清晰地看到整个实现的过程。

在讲解代码之前,我觉得有必要对事务的一些基本知识进行一下解释,虽然我们对事务的概念已经很熟悉了,但是涉及到事务的传播属性这些概念还是很有必要知道的。

目录

1.基础知识

2.声明式事务处理的基本过程


1.基础知识

指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。这是我在百度上找到的概念。事务的概念里面我们可以找到一些重点。首先,“可能”。事务执行的结果有两种,一个是提交成功,也即是操作数据库成功。还有一个就是提交失败,这个时候会进行相应的回滚操作,将这个事务中之前的对于数据库的修改统统改为之前修改的结果。从这个地方我们也可以知道事务的执行和线程是息息相关的,因为它需要保存执行之前的结果。和线程里面的中断有着类似的功能。

事务的传播属性

PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

这是我们对于我们设置为事务一系列数据库的操作的执行要求。

2.声明式事务处理的基本过程

  我们在使用Spring声明式事务处理的时候,需要我们配置一个TransactionProxyFactoryBean类。这个类是整个事务处理执行的核心,它配置我们事务处理的所有基本信息

这是原书中的解释。从中我们可以看到事务使用了aop功能。具体的功能的使用我们在之后的分析中会慢慢看到。

首先我们来看一下关于事务处理拦截器的配置

	private final TransactionInterceptor transactionInterceptor = new TransactionInterceptor();

这个拦截器就是通过AOP(代理机制)发挥作用,通过这个拦截器的实现,Spring封装了事务处理实现。

public void setTransactionAttributes(Properties transactionAttributes) {
		this.transactionInterceptor.setTransactionAttributes(transactionAttributes);
	}

可以看到这个地方通过Properties配置对象来依赖注入事务属性,读取BeanDefinition中的配置信息注入到我们之前声明的拦截器中。接下来就是创建Spring AOP对事务处理的Advistor

我们进入到createMainInterceptor方法中

if (this.pointcut != null) {
			return new DefaultPointcutAdvisor(this.pointcut, this.transactionInterceptor);
		}

 如果配置了我们的切面,那么就使用默认的通知器DefaultPointcutAdvisor

如果没有配置切面就按照下方代码执行

else {
			// Rely on default pointcut.
			return new TransactionAttributeSourceAdvisor(this.transactionInterceptor);
		}

这个类的实现代码里面我们可以看到Spring事务的AOP配置完成,但是书上同样给了我们一个问题。那就是TransactionInterceptor的配置是什么时候启动的,从而成为了Advistor的一部分。书上给的答案是这个方法

afterPropertiesSet()

具体的实现过程和我们在AOP里面的拦截器链的生成非常类似同样是对通知器进行一个加入。这里的通知器书上说的并不清楚,我认为是对于事务(也就是我们需要进行事务操作方法)的增强,比如执行提交成功或者回滚操作一样。然后就是配置相应的AOP目标源。也就是我们的目标对象,包含需要被事务增强方法的对象。

当然事务和我们的AOP切面还不太一样。因为事务的处理是很复杂的,这需要我们配置更多的其他属性。比如我刚才所说的事务传播属性。这些属性的配置,将会在TransactionInterceptor对事务方法进行拦截时起到作用。这些我打算在下一次的讲解中展示出来。

猜你喜欢

转载自blog.csdn.net/qq1641530151/article/details/83386750