深入理解分布式事务:原理与实战
上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();
}