source-code-hunter/docs/Spring/SpringTransaction/Spring事务处理的设计与实现.md
2020-01-18 21:45:01 +08:00

3.1 KiB
Raw Blame History

1 事务处理的编程式使用

		TransactionDefinition td = new DefaultTransactionDefinition();
		TransactionStatus ts = transactionManager.getTransaction(td);
		try {
			// 这里是需要进行事务处理的方法调用
		}
		catch (Exception e) {
			transactionManager.rollback(ts);
			throw e;
		}
		transactionManager.commit(ts);

在使用编程式事务处理的过程中利用DefaultTransactionDefinition对象来持有事务处理属性。同时在创建事务的过程中得到一个TransactionStatus对象然后通过直接调用transactionManager的commit()和rollback()方法来完成事务处理。在这个编程式使用事务管理的 过程中没有看到框架特性的使用非常简单和直接很好地说明了事务管理的基本实现过程以及在Spring事务处理实现中涉及一些主要的类比如TransationStatus、TransactionManager等对这些类的使用与声明式事务处理的最终实现是一样的。

与编程式使用事务管理不同在使用声明式事务处理的时候因为涉及Spring框架对事务处理的统一管理以及对并发事务和事务属性的处理所以采用的是一个比较复杂的处理过程但复杂归复杂这个过程对使用声明式事务处理的应用来说基本上是不可见的而是由Spring框架来完成的。有了这些背景铺垫和前面对AOP封装事务处理的了解下面来看看Spring是如何提供声明式事务处理的Spring在这个相对较为复杂的过程中封装了什么。这层封装包括在事务处理中事务的创建、提交和回滚等比较核心的操作。

2 事务的创建

作为声明式事务处理实现的起始点需要注意TransactionInterceptor拦截器的invoke()回调中使用的createTransactionIfNecessary()方法这个方法是在TransactionInterceptor的基类TransactionAspectSupport中实现的。为了了解这个方法的实现先分析一下TransactionInterceptor的基类实现TransactionAspectSupport并以这个方法的实现为入口了解Spring是如何根据当前的事务状态和事务属性配置完成事务创建的。

这个TransactionAspectSupport的createTransactionIfNecessary()方法作为事务创建的入口其具体的实现时序如下图所示。在createTransactionIfNecessary()方法的调用中会向AbstractTransactionManager执行getTransaction()方法这个获取Transaction事务对象的过程在AbstractTransactionManager实现中需要对事务的情况做出不同的处理然后创建一个TransactionStatus并把这个TransactionStatus设置到对应的TransactionInfo中去同时将TransactionInfo和当前的线程绑定从而完成事务的创建过程。createTransactionIfNeccessary()方法调用中可以看到两个重要的数据对象TransactionStatus和TransactionInfo的创建这两个对象持有的数据是事务处理器对事务进行处理的主要依据对这两个对象的使用贯穿着整个事务处理的全过程。

3 事务的挂起

4 事务的提交

5 事务的回滚