Spring框架最引人瞩目的原因之一就是全面的事务支持,spring提供给了一致的事务管理抽象,同样这也带来了许多的好处:

   .为复杂的事务api提供了一致的编程模型,例如jta、hibernate、jpa等

   .支持声明式事务管理

   .非常好的整合spring的各种数据访问抽象

   传统上,javaee开发者 有两个事务管理的选择:全局和本地。全局事务由应用服务器管理,使用api笨重的jta。局部事务是和资源相关的,比如一个和jdbc连接关联的事务,这个选择有深刻的含义,例如:全局事务可以有多可事务性的资源。使用局部事务,用用 服务器不需要参与事务管理,并且不能够保证跨越多个资源的事务的正确性

   全局事务:全局事务有个很大的缺陷,代码需要用jta,一个笨重的api。使用全局事务限制了应用代码的重用性,因为jta只有在应用服务器的环境中才能使用。

   本地事务:本地事务容易使用,但是也有明显的缺陷,他们不能用于多个事务性的资源,例如jdbc连接的事务管理的代码不能应用于全局的jta事务中,另一个缺点就是局部事务趋向于入侵式的编程模型。

   spring解决了这些问题,它使得开发者能够在任何环境下使用一致的编程模型,spring同时提供声明式事务和编程式事务,声明式事务管理是多数开发者的首选,在多数情况下也是被推荐使用的。

   使用编程式事务管理 ,开发者直接使用spring框架的事务抽象,这个抽象可以使用在任何底层事务基础之上。使用首选的声明式模型,开发者通常书写很少的或者没有事务相关的代码,因此不依赖spring框架或者任何其他事务api。

   spring事务抽象的关键是事务策略的概念,由spring的PlatFormTransactionManager借口定义

public interface PlatformTransactionManager {
    TransactionStatus getTransaction(TransactionDefinition definition)
        throws TransactionException;
    void commit(TransactionStatus status) throws TransactionException;
    void rollback(TransactionStatus status) throws TransactionException;
}

PlatFormTransactionManager抛出的异常时unchecked Exception的,底层的事务失败几乎都是致命的,很少情况下应用程序代码可以从他们中恢复过来,不过应用开发者可以捕获并处理TransactionException。

   TransactionDefinition接口;

       事务隔离:当前事务和其他事务的隔离程度。

       事务传播:通常在一个事务中执行的所有代码都会在这个事务中运行。但是,如果一个事务上下文已经存在,有几个选项可以指定一个事务性方法的执行行为:例如,简单地在现有的事务中继续运行(大多数情况);或者挂起现有事务,创建一个新的事务

       事务超时:事务在超时后多久会背底层的事务设施回滚

       只读状态:只读事务不修改任何的数据,在某种情况下是一种很有用的优化。