深入解读Spring Framework事务管理(第一弹:Spring Framework的事务抽象)

来源:互联网 发布:新手开淘宝店详细步骤 编辑:程序博客网 时间:2024/06/06 11:15

Spring Framework事务管理高层抽象主要包括3个接口:
- PlatformTransactionManager 事务管理器
- TransactionDefinition 事务定义信息(隔离、传播、超时、只读)
- TransactionStatus 事务具体运行状态
要理解Spring Framework的事务抽象,首先就要理解这三个接口。我们来具体看一下这三个接口。

PlatformTransactionManager

Spring事物抽象的关键就是事务策略的概念。事务策略在接口org.springframework.transaction.PlatformTransactionManager中定义,我们来看一下源码。

源码

因为有大量的注释,所以源码看起来很长。我们把注释去掉看一下:

package org.springframework.transaction;public interface PlatformTransactionManager {    TransactionStatus getTransaction(            TransactionDefinition definition) throws TransactionException;    void commit(TransactionStatus status) throws TransactionException;    void rollback(TransactionStatus status) throws TransactionException;}

这是一个主要的的service provider interface(SPI)。他里面主要就是三个方法,下面来分别看一下。

getTransaction

TransactionStatus getTransaction(TransactionDefinition definition)
这个方法是根据具体的事务传播行为来返回一个当前活动的事务或者创建一个新事务。
返回一个TransactionStatus对象的getTransaction(..)方法需要TransactionDefinition参数。返回的 TransactionStatus可能代表了一个新的事务,也有可能是代表了一个已经存在的事务,如果在调用栈中有已经存在的事务相匹配的话。

commit

void commit(TransactionStatus status)
这个方法是根据他的status提交给定的事务。

rollback

void rollback(TransactionStatus status)
这个方法是回滚给定的事务。

TransactionException

由PlatformTransactionManager接口的任何方法抛出来的TransactionException异常的类型是unchecked的。就是说,它继承自 java.lang.RuntimeException类,我们以有选择地捕获并处理TransactionException。

常见实现

Spring为不同的持久层框架提供不同PlatformTransactionManager接口实现。
目前已知的实现类有:
AbstractPlatformTransactionManager, CciLocalTransactionManager, DataSourceTransactionManager, HibernateTransactionManager, HibernateTransactionManager, HibernateTransactionManager, JdoTransactionManager, JmsTransactionManager, JpaTransactionManager, JtaTransactionManager, WebLogicJtaTransactionManager, WebSphereUowTransactionManager
其中比较常见的实现是:
org.springframework.jdbc.datasource.DataSourceTransactionManager 使用SpringJDBC或Mybatis作为持久层框架
org.springframework.orm.hibernate3.HibernateTransactionManager 使用Hibernate3作为持久层框架
org.springframework.orm.hibernate4.HibernateTransactionManager 使用Hibernate4作为持久层框架
org.springframework.orm.hibernate5.HibernateTransactionManager 使用Hibernate5作为持久层框架

TransactionDefinition

这个接口处于org.springframework.transaction包下,源码如下。

源码

同样,源码太长,我们把注释去掉看一下:

package org.springframework.transaction;import java.sql.Connection;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;    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();    String getName();}

源码分析

这个接口里面有不少的属性和方法,我们分组来看一下:

隔离级别(Isolation)

定义当前事务和其他工作的事务独立的程度。例如,当前事务能否感知到其他事务未提交的写请求?
- ISOLATION_DEFAULT 默认。根据底层的数据源使用默认的隔离级别。
- ISOLATION_READ_UNCOMMITTED 读未提交。会发生脏读、不可重复读和幻读。
- ISOLATION_READ_COMMITTED 读提交。可以避免脏读,但是不可重复读和幻读还是会发生。
- ISOLATION_REPEATABLE_READ 可重复读。可以避免脏读和不可重复读,但是幻读还是会发生。
- ISOLATION_SERIALIZABLE 序列化。脏读、不可重复读和幻读都可以避免。
- getIsolationLevel() 返回事务的隔离级别。

传播行为(Propagation)

通常,在一个事务的范围内执行的代码也都在那个事务里面执行。然而,你可以拥有定义当一个事务相关的方法在一个事务上下文已经存在时的行为。例如,代码可以在已经存在的事务中继续运行;或者将那已经存在的事务挂起然后新建一个事务。
- PROPAGATION_REQUIRED 支持当前事务,如果不存在,就新建一个。
- PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务。
- PROPAGATION_MANDATORY 支持当前事务,如果不存在,就抛出异常。
- PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务。
- PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务。
- PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常。
- PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行。
- getPropagationBehavior() 返回事务的传播行为。

超时(Timeout)

事务多长时间会计时归零并自动调用底层事务单元进行回滚。
- TIMEOUT_DEFAULT 使用底层事务系统的默认超时,如果不支持就不使用。
- getTimeout() 返回事务的超时时间。

只读状态(Read-only status)

一个设置了只读的事务可以在你的代码需要读但是却不会修改数据的时候使用。
isReadOnly() 返回是否是一个只读事务。

事务名称(Transaction name)

getName() 返回事务的名称。

常见实现

目前有如下实现:
DefaultTransactionAttribute, DefaultTransactionDefinition, DelegatingTransactionAttribute, DelegatingTransactionDefinition, RuleBasedTransactionAttribute, TransactionTemplate

TransactionStatus

接口TransactionStatus提供了一个操控事务执行和查询事务状态的简单方法。

源码

我们还是先来看一下注释去掉了的源码:

package org.springframework.transaction;import java.io.Flushable;public interface TransactionStatus extends SavepointManager, Flushable {    boolean isNewTransaction();    boolean hasSavepoint();    void setRollbackOnly();    boolean isRollbackOnly();    @Override    void flush();    boolean isCompleted();}

源码分析

  • isNewTransaction() 返回当前事务是不是一个新的事务。
  • hasSavepoint() 返回当前事务是否包含保存点,也就是说,是否是作为一个基于保存点的嵌套事务来创建的 。
  • setRollbackOnly() 把事务设为不可提交的。
    换句话说,在调用完setRollbackOnly()后你所能执行的唯一操作就是回滚。在大多数情况下,事务管理器会检测到这一点,在它发现事务要提交时会立刻结束事务。
  • isRollbackOnly() 返回当前事务是否是不可提交的 。
  • flush() 把底层回话中的修改刷新到数据库。
  • isCompleted() 返回当前事务是否已经完成,也就是说,是否已经提交或回滚。

常见实现

目前已有的实现如下:
AbstractTransactionStatus, DefaultTransactionStatus, SimpleTransactionStatus

1 0