spring 事务管理抽象
Spring提供了一致的事务管理抽象。这个抽象是Spring最重要的抽象之一, 它有如下的优点:
为不同的事务API提供一致的编程模型,如JTA、JDBC、Hibernate、iBATIS数据库层 。
提供比大多数事务API更简单的,易于使用的编程式事务管理API
整合Spring数据访问抽象
支持Spring声明式事务管理
JDBC事务容易使用,但也有明显的缺点:它们不能用于多个事务性资 源,并且趋向侵入的编程模型。
Spring解决了这些问题。它使应用开发者能够使用在任何环境 下使用一致的编程模型。你可以只写一次你的代码,这在不同环境 下的不同事务管理策略中很有益处。Spring同时提供声明式和编程式事务管理。
使用编程式事务管理,开发者直接使用Spring事务抽象,这个抽象可以使用在任何 底层事务基础之上。使用首选的声明式模型,开发者通常书写很少的事务相关代 码,因此不依赖Spring或任何其他事务API。
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接口,虽然它也可以在编码中使用。注意按照Spring的哲学, 这是一个接口。因而如果需要它可以很容易地被模拟和 桩化。它也没有和一个查找策略如JNDI捆绑在一起:PlatformTransactionManager 的实现定义和其他Spring IoC容器中的对象一样。这个好处使得即使使用JTA,也 是一个很有价值的抽象:事务代码可以比直接使用JTA更加容易测试。
继续Spring哲学,TransactionException
是unchecked的。 低层的事务失败几乎都是致命。很少情况下应用程序代码可以从它们 中恢复,不过应用开发者依然可以捕获并处理TransactionException
。
getTransaction()
根据一个类型为 TransactionDefinition
的参数返回一个 TransactionStatus
对象。返回的 TransactionStatus
对象可能代表一个新的或已经存在的事 务(如果在当前调用堆栈有一个符合条件的事务)。
一个TransactionStatus
也是和执 行的线程关联的。
TransactionDefinition
接口指定:
事务隔离:当前事务和其它事务的隔离的程度。 例如,这个事务能否看到其他事务未提交的写数据?
事务传播:通常在一个事务中执行的 所有代码都会在这个事务中运行。但是,如果一个事务上下文已经存在, 有几个选项可以指定一个事务性方法的执行行为:例如,简单地在现有的 事务中运行(大多数情况);或者挂起现有事务,创建一个新的事务。
事务超时: 事务在超时前能运行多 久(自动被底层的事务基础设施回滚)。
只读状态: 只读事务不允许修改任何数 据。只读事务在某些情况下是一种非常有用的优化。
这些设置反映了标准概念。如果需要,请查阅讨论事务隔离层次和其他核心事 务概念的资源:理解这些概念在使用Spring和其他事务管理解决方案时是非常关键的。
TransactionStatus
接口为处理事务的代码提供一个简单 的控制事务执行和查询事务状态的方法。这个概念应该是熟悉的,因为它们在所 有的事务API中是相同的:
public interface TransactionStatus { boolean isNewTransaction(); void setRollbackOnly(); boolean isRollbackOnly(); }
但是使用Spring事务管理时,定义 PlatformTransactionManager
的实现是基本方式。在好的Spring 风格中,这个重要定义使用IoC实现。
微信公众号: java技术*
技术交流群*: 245130488