Spring事务抽象
??? Spring事务抽象的关键是事务策略的概念。这个概念由org.springframework.transaction.PlatformTransactionManager接口定义,接口代码如下:
public interface PlatformTransactionManager{ TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus status) throws TransactionException;}
? ? 这首先是一个SPI接口,虽然它也可以在编程中使用。它也没有和一个查找策略如JNDI捆绑在一起:PlatformTransactionManager的实现定义和其他Spring IoC容器中的对象一样。这个好处使得即使使用JTA,事务代码也可以比直接使用JTA更加容易测试。
??? PlatformTransactionManager接口中每个方法都跑出的TransactionException是unchecked exception(继承自java.lang.RuntimeException)的。底层的事务失败几乎总是致命的。很少情况下应用程序代码可以从它们中恢复,不过应用开发者依然可以捕获并处理TransactionException。
??? getTransaction(TransactionDefinition definition)方法根据一个类型为TransactionDefinition的参数返回一个TransactionStatus对象。返回的TransactionStatus对象可能代表一个新的或已经存在的事物(如果在当前调用堆栈有一个符合条件的事务。如同J2EE事务环境,一个TransactionStatus也是和执行线程绑定的)。
?? TransactionDefinition接口指定了:
事务隔离:当前事务和其他事务的隔离程度。例如,这个事务能否看到其他事务未提交的写数据。事务传播:通常一个事务中执行的所有代码都会在这个事务中运行。但是如果一个事务上下文已经存在,有几个选项可以指定一个事务性方法的执行行为:例如,简单的在现有的事务中继续运行(大多数情况);或者挂起现有事务,创建一个新的事务。Spring提供EJB CMT中常见的事务传播选项。事务超时:事务在超时前能运行多久(自动被底层的事务基础设施回滚)。只读状态:只读事务不修改任何数据。只读事务在某些情况下(例如使用Hibernate时),是一种非常有用的优化。??? TransactionStatus接口为处理事务的代码提供了一个简单的控制事务执行和查询事务状态的方法。这个概念在所有的事务API中是相同的:
public interface TransactionStatus{ boolean isNewTransaction(); void setRollbackOnly(); boolean isRollbackOnly();}?
?
?
?
?
?
?