在Spring事务管理SPI(Service Provider Interface)的抽象层主要包括三个接口分别是:PlatformTransactionManager,TransactionDefinition,TransactionStatus
,均位于org.springframework.transaction包下。
TransactionDefinition用于描述事务的隔离级别、超时时间、是否位置度事务和事务传播规则等控制事务具体行为的食物属性,这些事务属性可以通过XML配置或者注解描述提供,也可以通过手工编程的方式设置。
PlatformTransactionManager根据TransactionDefinition提供的事务属性配置信息创建事务,并用TransactionStatus描述这个激活事务的状态。
下面分析源码:
TransactionDefinition
TransactionDefinition 定义了Spring兼容的事务属性。
公共方法:
getPropagationBehavior
/**
* 返回传播行为,就是我们常说的事务传播行为。
*/
int getPropagationBehavior();
在TransactionDefinition中定义了七个事务传播行为,我们一会单独对这七个事务传播行为进行解释。
getIsolationLevel
/**
* 返回隔离级别
*/
int getIsolationLevel();
在TransactionDefinition中定义了与java.sql.Connection接口同名的四个事务隔离级别此外,TransactionDefinition还定义了一个默认的隔离级别:ISOLATION_DEFAULT,它表示底层数据库默认隔离界别。
getTimeout
/**
* 返回事务超时。
*/
int getTimeout();
事务在超时前能运行多久,超过时间后,事务被回滚。
isReadOnly
/**
* 返回只读状态
*/
boolean isReadOnly();
只读事务不修改任何数据,资源事务管理骑着可以针对刻度事务应用一些优化措施,提高性能运行,
getName
/**
* 返回当前事务名称,可空。
*/
@Nullable
String getName();
PlatformTransactionManager
公共方法:
getTransaction
TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException;
该方法根据实物定义信息从事务环境中返回一个已存在的事务,或者创建一个新的事务,并用TransactionStatus描述这个事务的状态
commit
void commit(TransactionStatus status) throws TransactionException;
根据实物的状态体积哦啊事务。如果事务状态已经被标识为rollback-only,则该方法将执行一个回滚事务的操作。
rollback
void rollback(TransactionStatus status) throws TransactionException;
将事务回滚。当commit()方法抛出异常时,rollback()方法会被隐式调用。
TransactionStatus
TransactionStatus 代表一个事务的具体运行状态。事务管理器可以通过该接口获取事务运行期的状态信息,也可以通过该接口间接地回滚事务
TransactionStatus 类 继承自SavepointManager 和 Flushable接口。先看下这两个接口
公共方法:
SavepointManager
createSavepoint
创建一个保存点对象,以便在后面可以利用 rollbackToSavepoint(Object savepoint) 方法使事务回滚到特定的保存点上,也可以通过releaseSavepoint()方法释放一个已经不用的保存点。
Object createSavepoint() throws TransactionException;
rollbackToSavepoint
将事务回滚到特定的保存点上,被回滚的保存点将自动释放。
void rollbackToSavepoint(Object savepoint) throws TransactionException;
releaseSavepoint
释放一个保存点。如果将事务提交,则所有的保存点会被自动释放,无序手动清除
void releaseSavepoint(Object savepoint) throws TransactionException;
上面三个方法在底层的资源不支持保存点的时候,都将抛出NestedTransactionNotSupported Exception异常。
Flushable
公共方法:
flush
通过将任何缓冲输出写入基础流 来 刷新当前流。
void flush() throws IOException;
TransactionStatus 公共方法
isNewTransaction
判断当前事务是否是一个新的事务,如果返回false,则表示当前事务是一个已经存在识时务,或者当前操作未运行在事物环境中;
boolean isNewTransaction();
hasSavepoint
判断当前事务是否在内部创建了一个保存点,该保存点是为了支持Spring的嵌套事务而创建的。
boolean hasSavepoint();
setRollbackOnly
将当前事务设置为rollbacl-only。通过该标识通知事务管理器只能将事务回滚,事务管理器将通过显式调用回滚命令或抛出异常的方式回滚事务
void setRollbackOnly();
isRollbackOnly
判断当前事务是否已经被标识为rollbacl-only。
boolean isRollbackOnly();
flush
重写父类方法。刷新。
@Override
void flush();
isCompleted
判断当前事务是否已经结束(已经提交或回滚)
boolean isCompleted();
ok,上面我们将事务管理接口简单介绍完毕。下面介绍一下上面提到过的事务传播行为
事务传播行为
当我们调用一个基于Spring的Service接口方法时,它将运行于Spring管理的事务环境中,Service接口方法可能会在内部调用其他的Service接口方法以完成一个完整的业务操作,因此就会产生服务接口方法嵌套调用的情况。
Springh通过事务传播行为控制当前的事务如何传播到被嵌套调用的目标服务接口方法中。事务传播是Spring进行事务管理的重要概念。
刚才说到在TransactionDefinition
中定义了七种类型的事务传播行为。
事务传播行为类型 | 说明 | TransactionDefinition.code |
---|---|---|
PROPAGATION_REQUIRED | 如果当前没有事务,则新建一个事务;如果已经存在一个事务,则加入到这个事务中。这是最常见的选择 | 0 |
PROPAGATION_SUPPORTS | 支持当前事务。如果当前没有事务,则以非事务方式执行。 | 1 |
PROPAGATION_MANDATORY | 使用当前事务。如果当前没有事务,则抛出异常 | 2 |
PROPAGATION_REQUIRES_NEW | 新建事务。如果当前存在事务,则把当前事务挂起 | 3 |
PROPAGATION_NOT_SUPPORTED | 以非事务方式执行操作。如果当前存在事务,则把当前事务挂起 | 4 |
PROPAGATION_NEVER | 以非事务方式执行。如果当前存在事务,则抛出异常 | 5 |
PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行,如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作 | 6 |