spring的声明式事务管理使用spring aop实现的,由于spring致力于无侵入性,一般不需要理解aop的概念就可以进行声明式事务管理,

   spring的声明式事务管理可以在任何环境下使用,只需要更新配置文件,就可以和jdbc、hibernate或其他的事务机制一起工作,并且这中管理机制可以应用到任何一个java类以及类的实例上,同样spring也提供了声明式的回滚规则。但是spring的声明式事务处理不提供高端应用服务器提供的跨越远程调用的事务上下文传播。

   spring声明式事务管理最重要的概念是:spring的事务管理是通过aop实现的,其中的事务通知由目前基于XML或者注解的元数据驱动,代理对象与事务元数据结合产生了一个aop代理,它使用一个PlatformTransactionManager的实现品配合TransactionInterceptor在方法执行的前后过程中实施事务。

   当spring框架的事务基础架构默认抛出运行时、unchecked Exception时,事务才会回滚,也就是说如果抛出一个RuntimeException或者其子类时候。从事务中抛出的checked exception不会进行回滚操作。我们可以在配置文件中给具体的方法加上rollback-for = NoProductInStockException。有时候就算你不想在异常抛出的时候回滚事务,就可以使用不会滚的规则no-rollback-for = instrumentNotFoundException当然除了声明式的事务回滚规则之外我们还可以通过编程式的方式来指定事务的回滚,例如下面

public void resolvePosition() {
  try {
                                                                                                                                        
  } catch (NoProductInStockException ex) {
                                                                                                                                        
    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  }
}

虽然写法简单,但是不符合spring提倡的无***性,并且使你的代码与spring框架的事务高度耦合。


现在让我们考虑一下这样的场景,假设你有许多服务对象,你想为他们分别设置完全不同的事务语义。 在Spring中,你可以通过分别定义特定的 元素, 让每个advisor采用不同的 'pointcut''advice-ref' 属性,来达到目的。如下


    
    
    
    
  
  
  
  
    
      
      
    
  
  
    
      
    
  

除了基于xml配置文件的形式进行声明式事务配置外,我们还可以使用注解的方式进行声明式的事务管理,直接在java源码中声明事务语义的做法让事务和将受其影响的代码距离更近,而且一般来说不会有不恰当的耦合风险,@Transaction注解可用于接口定义和接口方法、类定义和类的public方法上,然而并不是加了这个注解就×××启了事务行为,它仅仅是一种元数据。我们用的时候尽量把注解加在类上,而不要加载接口上,因为注解是不能继承的,这就意味者如果你使用基于类的代理时,实物的设置将不能被基于类的代理所识别,而且对象也不会背事务代理包装。