TransactionRollbackTree

事务回滚技术研究

    事务分类:
	       1)编码方式;
           2)声明式事务管理方式。

     声明式事务管理是通过AOP技术实现的,实质就是:在方法执行前后进行拦截,然后在目标方法
     开始之前创建并加入事务,执行完成目标方法后根据执行情况提交后回滚事务。

     声明式事务管理有两种方式:基于XML配置文件(拦截器 AOP),通过标签@Transaction注解

###事务的传播属性

PROPAGATION_REQUIRED
      当前方法必须开启事务,如果当前线程不存在事务,则开启新的事务,如果当前线程已经存在事
  务,就加入到当前事务。
      这个是经常使用的。但是要注意的就是一旦事务中的某一个方法回滚,当前事务上下文里所有的
  操作都回滚。

PROPAGATION_REQUIRES_NEW:
      当前方法必须要求开启新的事务,如果当前线程已经存在事务上下文,就暂停当前事务,等待新
  事务执行结束之后,再继续恢复之前的事务。

PROPAGATION_MANDATORY:
      当前方法必须要求事务,如果当前线程不存在事务,就抛出异常,如果存在,就加入事务里。

PROPAGATION_SUPPORTS:
      当前方法支持事务,如果当前线程存在事务,就加入到事务中去,如果不存在,不做任何操作。

PROPAGATION_NOT_SUPPORTED:
      当前方法不支持事务,如果当前线程存在事务,就挂起当前事务,执行完当前方法,恢复事务,
   一般情况下载查询的时候使用,并且非常耗时就可以使用Not Support,避免事务时间超长。

PROPAGATION_NEVER:
      当前方法不支持事务,如果当前线程存在事务,则抛出异常,这种用的很少。

PROPAGATION_NESTED:
      他与PROPAGATION_REQUIRES_NEW的区别是,PROPAGATION_REQUIRES_NEW另起一个事务,
   将会与他的父事务相互独立,
      而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是
   说,如果父事务最后回滚,他也要回滚的
回滚类型:

      1)rollbackFor:一组异常类的实例,遇到时必须进行回滚
      2)rollbackForClassname:一组异常类的名字,遇到时必须进行回滚
      3)noRollbackFor:一组异常类的实例,遇到时必须不回滚
      5)noRollbackForClassname:一组异常类的名字,遇到时必须不回滚
Spring事务回滚策略
      spring的事务管理默认只对出现运行期异常(Java.lang.RuntimeException及其子类)进行回滚

      改变默认方式  
          在@Transaction注解中定义noRollbackFor和RollbackFor指定某种异常是否回滚。  
          @Transaction(noRollbackFor=RuntimeException.class)  
          @Transaction(RollbackFor=Exception.class)  
这样就改变了默认的事务处理方式。

例子:
    @Override
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
    public synchronized int addAuthToRoles(List list, List ids) {