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

2014-11-24 03:00:34 · 作者: · 浏览: 19

1.编程式事务处理:

Spring提供编程式和声明式两种事务处理方式,我们首先通过一个编程式事务的小例子了解Spring中编程式事务处理的基本实现:

[java] view plaincopyprint //通过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类型的事务处理器分别通过下面两个方法创建事务信息对象:

[java] view plaincopyprint TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification); TransactionInfo txInfo = prepareTransactionInfo(tm, txAttr, joinpointIdentification, status);

事务拦截器TransactionInterceptor回调方法invoke通过调用TransactionAspectSupport事务切面支持类中的createTransactionIfNecessary和prepareTransactionInfo方法创建事务对象:

[java] view plaincopyprint //根据给定的事务属性创建事务对象 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