Spring事务02事务管理器2AbstractPlatformTransactionManager

编程

挑几个常见的实现类,Spring 事务管理重要的是 DataSourceTransactionManager

 1 类解释

/**

* 实现Spring标准事务工作流的抽象基类,

* 作为具体平台事务管理器的基础,如{@link org.springframework.transaction.jta.JtaTransactionManager}。

*

* 这个基类提供了以下的工作流程处理:

* 1 确定是否存在现有事务;

* 2 应用适当的传播行为;

* 3 如有需要,暂停及恢复交易;

* 4 在提交时检查仅回滚标志;

* 5 对回滚应用适当的修改(实际回滚或仅设置回滚);

* 6 触发已注册的同步回调(如果事务同步是活动的)。

*

* 子类必须为事务的特定状态实现特定的模板方法,例如:begin、suspend、resume、commit、rollback。

* 其中最重要的是抽象的,必须通过具体的实现来提供;

* 对于其余部分,则提供默认值,因此覆盖是可选的。

*

* 事务同步是注册在事务完成时调用的回调的通用机制。

* 这主要是内部使用的数据访问支持类JDBC, Hibernate, JPA,

* 当在JTA事务中运行时:它们注册在事务中打开的资源,以便在事务完成时关闭,

* 允许在事务中重用同一个Hibernate会话。

* 同样的机制也可以用于应用程序中的自定义同步需求。

*

* 这个类的状态是可序列化的,允许序列化事务策略和携带事务拦截器的代理。

* 如果子类希望它们的状态也是可序列化的,则由子类决定。

* 它们应该实现{@code java.io.Serializable}标记接口,

* 如果需要恢复任何瞬态状态,则可以使用私有的{@code readObject()}方法(根据Java序列化规则)。

*

* @see #setTransactionSynchronization

* @see TransactionSynchronizationManager

* @see org.springframework.transaction.jta.JtaTransactionManager

*/

public abstract class AbstractPlatformTransactionManager

implements PlatformTransactionManager, Serializable {}

2 方法解释

2.1 doGetTransaction() 返回当前事务状态的事务对象

getTransaction() -> doGetTransaction() 抽象方法,子类需要实现。

/**

* This implementation handles propagation behavior.

* Delegates to {@code doGetTransaction}, {@code isExistingTransaction} and {@code doBegin}.

*

* 此实现处理传播行为。

* 委托给{@code doGetTransaction}、{@code isExistingTransaction}和{@code doBegin}。

*

* @see #doGetTransaction

* @see #isExistingTransaction

* @see #doBegin

*/

@Override

publicfinal TransactionStatus getTransaction(@Nullable TransactionDefinition definition)

throws TransactionException {

// 返回当前事务状态的事务对象

Object transaction = doGetTransaction();

/** 省略其他代码 **/

// 检查给定的事务对象是否指示现有事务(即已启动的事务)。

isExistingTransaction(transaction);

/** 省略其他代码 **/

// 根据给定的事务定义使用语义开始一个新的事务

doBegin(transaction, definition);

/** 省略其他代码 **/

}

/**

* Return a transaction object for the current transaction state.

* <p>The returned object will usually be specific to the concrete transaction

* manager implementation, carrying corresponding transaction state in a

* modifiable fashion. This object will be passed into the other template

* methods (e.g. doBegin and doCommit), either directly or as part of a

* DefaultTransactionStatus instance.

* <p>The returned object should contain information about any existing

* transaction, that is, a transaction that has already started before the

* current {@code getTransaction} call on the transaction manager.

* Consequently, a {@code doGetTransaction} implementation will usually

* look for an existing transaction and store corresponding state in the

* returned transaction object.

*

* 返回当前事务状态的事务对象。

* <p>返回的对象通常特定于具体的事务管理器实现,以可修改的方式携带相应的事务状态。

* 该对象将被传递到其他模板方法中(如doBegin和doCommit),

* 直接或作为DefaultTransactionStatus实例的一部分。

* <p>返回的对象应该包含任何现有事务的信息,

* 也就是说,在事务管理器上的当前{@code getTransaction}调用之前已经启动的事务。

* 因此,{@code doGetTransaction}实现通常会查找现有事务并在返回的事务对象中存储相应的状态。

*

* @return the current transaction object

* @throws org.springframework.transaction.CannotCreateTransactionException

* if transaction support is not available

* @throws TransactionException in case of lookup or system errors

* @see #doBegin

* @see #doCommit

* @see #doRollback

* @see DefaultTransactionStatus#getTransaction

*/

protectedabstract Object doGetTransaction() throws TransactionException;

/**

* Check if the given transaction object indicates an existing transaction

* (that is, a transaction which has already started).

* <p>The result will be evaluated according to the specified propagation

* behavior for the new transaction. An existing transaction might get

* suspended (in case of PROPAGATION_REQUIRES_NEW), or the new transaction

* might participate in the existing one (in case of PROPAGATION_REQUIRED).

* <p>The default implementation returns {@code false}, assuming that

* participating in existing transactions is generally not supported.

* Subclasses are of course encouraged to provide such support.

*

* 检查给定的事务对象是否指示现有事务(即已启动的事务)。

*

* 结果将根据新事务的指定传播行为进行评估。

* 现有事务可能被挂起(在PROPAGATION_REQUIRES_NEW的情况下),

* 或者,新的事务可能参与现有的事务(在PROPAGATION_REQUIRED的情况下)。

*

* 默认实现返回{@code false},

* 假设通常不支持参与现有事务。

* 当然,我们鼓励子类提供这样的支持。

*

* @param transaction transaction object returned by doGetTransaction

* @return if there is an existing transaction

* @throws TransactionException in case of system errors

* @see #doGetTransaction

*/

protectedbooleanisExistingTransaction(Object transaction) throws TransactionException {

returnfalse;

}

2.2  doBegin() 根据给定的事务定义使用语义开始一个新的事务

getTransaction() -> doBegin() 抽象方法,子类需要实现。

/**

* 根据给定的事务定义使用语义开始一个新的事务。

* 不需要关心传播行为的应用,

* 因为这个抽象管理器已经处理过了。

*

* 当事务管理器决定实际启动一个新事务时,将调用此方法。

* 要么之前没有任何事务,要么之前的事务已被挂起。

*

* 一个特殊的情况是嵌套的事务没有保存点:

* 如果{@code使用avepointfornestedtransaction()}返回“false”,

* 必要时将调用此方法启动嵌套事务。

* 在这种情况下,将会有一个活动事务:

* 此方法的实现必须检测此情况并启动适当的嵌套事务。

*

* @param transaction transaction object returned by {@code doGetTransaction}

* @param definition a TransactionDefinition instance, describing propagation

* behavior, isolation level, read-only flag, timeout, and transaction name

* @throws TransactionException in case of creation or system errors

*/

protected abstract void doBegin(Object transaction, TransactionDefinition definition)

throws TransactionException;

2.3 doCommit() 执行给定事务的实际提交

commit() -> processCommit() -> doCommit()抽象方法,子类需要实现。

/**

* This implementation of commit handles participating in existing

* transactions and programmatic rollback requests.

* Delegates to {@code isRollbackOnly}, {@code doCommit}

* and {@code rollback}.

*

* 提交的这个实现处理参与现有事务和程序性回滚请求。

* 委托给{@code isRollbackOnly}、{@code doCommit}和{@code rollback}。

*

* @see org.springframework.transaction.TransactionStatus#isRollbackOnly()

* @see #doCommit

* @see #rollback

*/

@Override

public final void commit(TransactionStatus status) throws TransactionException {

/** 其他省略代码 **/

DefaultTransactionStatus defStatus = (DefaultTransactionStatus) status;

processCommit(defStatus);

}

/**

* Process an actual commit.

* Rollback-only flags have already been checked and applied.

*

* 处理实际的提交。仅回滚标志已经被检查和应用。

*

* @param status object representing the transaction

* @throws TransactionException in case of commit failure

*/

private void processCommit(DefaultTransactionStatus status) throws TransactionException {

/** 其他省略代码 **/

doCommit(status);

/** 其他省略代码 **/

}

/**

* Perform an actual commit of the given transaction.

* <p>An implementation does not need to check the "new transaction" flag

* or the rollback-only flag; this will already have been handled before.

* Usually, a straight commit will be performed on the transaction object

* contained in the passed-in status.

*

* 执行给定事务的实际提交。

*

* 实现不需要检查“新事务”标志或只回滚标志;

* 这在以前已经处理过了。

* 通常,直接提交将对包含在传入状态中的事务对象执行。

*

* @param status the status representation of the transaction

* @throws TransactionException in case of commit or system errors

* @see DefaultTransactionStatus#getTransaction

*/

protected abstract void doCommit(DefaultTransactionStatus status) throws TransactionException;

2.3 doRollback() 执行给定事务的实际回滚

rollback() -> processRollback() -> doRollback() 抽象方法,子类需要实现

/**

* This implementation of rollback handles participating in existing

* transactions. Delegates to {@code doRollback} and {@code doSetRollbackOnly}.

*

* 此回滚实现处理参与现有事务。

* 委托给{@code doRollback}和{@code doSetRollbackOnly}。

*

* @see #doRollback

* @see #doSetRollbackOnly

*/

@Override

public final void rollback(TransactionStatus status) throws TransactionException {

if (status.isCompleted()) {

throw new IllegalTransactionStateException(

"Transaction is already completed - do not call commit or rollback more than once per transaction");

}

DefaultTransactionStatus defStatus = (DefaultTransactionStatus) status;

processRollback(defStatus, false);

}

/**

* Process an actual rollback.

* The completed flag has already been checked.

*

* 处理实际的回滚。

* 已完成的标志已被检查。

*

* @param status object representing the transaction

* @throws TransactionException in case of rollback failure

*/

private void processRollback(DefaultTransactionStatus status, boolean unexpected) {

/** 其他省略代码 **/

doRollback(status);

/** 其他省略代码 **/

}

/**

* Perform an actual rollback of the given transaction.

* <p>An implementation does not need to check the "new transaction" flag;

* this will already have been handled before. Usually, a straight rollback

* will be performed on the transaction object contained in the passed-in status.

*

* 执行给定事务的实际回滚。

*

* 实现不需要检查“新事务”标志;

* 这在以前已经处理过了。

* 通常,将对包含在传入状态中的事务对象执行直接回滚。

*

* @param status the status representation of the transaction

* @throws TransactionException in case of system errors

* @see DefaultTransactionStatus#getTransaction

*/

protected abstract void doRollback(DefaultTransactionStatus status) throws TransactionException;

2.4 doCleanupAfterCompletion() 事务完成后清理资源

/**

* 完成后进行清理,必要时清除同步,并在完成后调用doCleanupAfterCompletion。

* @param status object representing the transaction

* @see #doCleanupAfterCompletion

*/

private void cleanupAfterCompletion(DefaultTransactionStatus status) {

status.setCompleted();

if (status.isNewSynchronization()) {

TransactionSynchronizationManager.clear();

}

if (status.isNewTransaction()) {

doCleanupAfterCompletion(status.getTransaction());

}

if (status.getSuspendedResources() != null) {

if (status.isDebug()) {

logger.debug("Resuming suspended transaction after completion of inner transaction");

}

Object transaction = (status.hasTransaction() ? status.getTransaction() : null);

resume(transaction, (SuspendedResourcesHolder) status.getSuspendedResources());

}

}

/**

* 事务完成后清理资源。

* 在执行{@code doCommit}和{@code doRollback}之后,对任何结果调用。

* 默认实现什么也不做。

* 不应该抛出任何异常,而只是对错误发出警告。

* @param transaction transaction object returned by {@code doGetTransaction}

*/

protected void doCleanupAfterCompletion(Object transaction) {

}

 

以上是 Spring事务02事务管理器2AbstractPlatformTransactionManager 的全部内容, 来源链接: utcz.com/z/513322.html

回到顶部