上QQ阅读APP看书,第一时间看更新
3.2 Spring事务三大接口
Spring支持事务的管理功能,最核心的就是Spring事务的三大接口:PlatformTransaction-Manager、TransactionDefinition和TransactionStatus。本节分别介绍这三大接口。
3.2.1 PlatformTransactionManager接口
通过Spring的源码可知,Spring并不是直接管理事务的,而是提供了多种事务管理器。通过这些事务管理器,Spring将事务管理的职责委托给了Hibernate、MyBatis、JTA等持久化框架的事务来实现。
PlatformTransactionManager接口位于Spring的org.springframework.transaction包下。通过PlatformTransactionManager接口,Spring为Hibernate、MyBatis、JTA等持久化框架提供了事务管理器,具体的实现由框架自己完成。
PlatformTransactionManager接口的源码如下所示。
public interface PlatformTransactionManager { /** *获取事务状态 */ TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException; /** *提交事务 */ void commit(TransactionStatus status) throws TransactionException; /** *回滚事务 */ void rollback(TransactionStatus status) throws TransactionException; }
3.2.2 TransactionDefinition接口
TransactionDefinition接口位于Spring的org.springframework.transaction包下,主要定义了与事务相关的方法,表示事务属性的常量等信息。部分事务属性的常量与Propagation枚举类中的事务传播类型相对应。
TransactionDefinition接口的源码如下所示。
public interface TransactionDefinition { /** *支持当前事务,若当前没有事务就创建一个新的事务 */ int PROPAGATION_REQUIRED = 0; /** *如果当前存在事务,则加入该事务,如果当前没有事务,则以非事务的方式继续运行 */ int PROPAGATION_SUPPORTS = 1; /** *如果当前存在事务,则加入该事务,如果当前没有事务,则抛出异常 */ int PROPAGATION_MANDATORY = 2; /** *创建一个新的事务,如果当前存在事务,则把当前事务挂起 */ int PROPAGATION_REQUIRES_NEW = 3; /** *以非事务方式运行,如果当前存在事务,则把当前事务挂起 */ int PROPAGATION_NOT_SUPPORTED = 4; /** *以非事务方式运行,如果当前存在事务,则抛出异常 */ int PROPAGATION_NEVER = 5; /** *表示如果当前正有一个事务在运行中,则该方法运行在一个嵌套的事务中, 被嵌套的事务可以独立于封装的事务进行提交或者回滚(这里需要事务的保存点), 如果封装的事务不存在,后续事务行为同PROPAGATION_REQUIRES NEW */ int PROPAGATION_NESTED = 6; /** *使用后端数据库默认的隔离级别 */ int ISOLATION_DEFAULT = -1; /** *最低的隔离级别 */ int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED; /** *阻止脏读,但是可能会产生幻读或不可重复读的问题 */ int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED; /** *可以阻止脏读和不可重复读,但是可能会产生幻读 */ int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ; /** *可以防止脏读、不可重复读以及幻读 */ int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE; /** *使用默认的超时时间 */ int TIMEOUT_DEFAULT = -1; /** *获取事务的传播行为 */ int getPropagationBehavior(); /** *获取事务的隔离级别 */ int getIsolationLevel(); /** *获取事务的超时时间 */ int getTimeout(); /** *返回当前是否为只读事务 */ boolean isReadOnly(); /** *获取事务的名称 */ @Nullable String getName(); }
3.2.3 TransactionStatus接口
TransactionStatus接口主要用来存储事务执行的状态,并且定义了一组方法,用来判断或者读取事务的状态信息。
TransactionStatus接口的源码如下所示。
public interface TransactionStatus extends SavepointManager, Flushable { /** *判断是否是新事务 */ boolean isNewTransaction(); /** *是否有保存点 */ boolean hasSavepoint(); /** *设置为只回滚 */ void setRollbackOnly(); /** *是否为只回滚 */ boolean isRollbackOnly(); /** *将事务涉及的数据刷新到磁盘 */ @Override void flush(); /** *判断当前事务是否已经完成 */ boolean isCompleted(); }