Spring 事务-04-隔离和传播-1-TransactionDefinition

孤人 提交于 2020-02-27 01:09:35

TransactionDefinition 实例(默认描述传播行为、隔离级别、超时等。

类图如下:

接口分析如下:

package org.springframework.transaction;

import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.lang.Nullable;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.jta.JtaTransactionManager;
import org.springframework.transaction.support.AbstractPlatformTransactionManager;

import java.sql.Connection;

/**
 * 定义与spring兼容的事务属性的接口,可以设置传播行为、隔离级别、超时等。
 * 基于类似于EJB CMT属性的传播行为定义。
 *
 * 注意,除非启动一个实际的新事务,否则不会应用隔离级别和超时设置。
 * 因为只有{@link #PROPAGATION_REQUIRED}、{@link #PROPAGATION_REQUIRES_NEW}和{@link #PROPAGATION_NESTED}可以导致,
 * 在其他情况下,指定这些设置通常没有意义。
 * 此外,请注意,并非所有事务管理器都支持这些高级特性,因此在给定非默认值时可能抛出相应的异常。
 *
 * {@link #isReadOnly() 只读标志} 适用于任何事务上下文,
 * 无论是由实际的资源事务支持,还是在资源级别上进行非事务操作。
 * 在后一种情况下,该标记将仅应用于应用程序内的托管资源,
 * 例如Hibernate {@code会话}。
 *
 * @since 08.05.2003
 * @see PlatformTransactionManager#getTransaction(TransactionDefinition)
 * @see org.springframework.transaction.support.DefaultTransactionDefinition
 * @see org.springframework.transaction.interceptor.TransactionAttribute
 */
public interface TransactionDefinition {

	//-----------------------------------------
	// 事务传播属性
	//-----------------------------------------

	/**
	 * 支持当前事务;
	 * 如果不存在,创建一个新的。
	 * 类似于同名的EJB事务属性。
	 * 这通常是事务定义的默认设置,通常定义事务同步范围。
	 */
	int PROPAGATION_REQUIRED = 0;

	/**
	 * 支持当前事务;如果不存在非事务执行。
	 * 类似于同名的EJB事务属性。
	 * 注意:对于具有事务同步的事务管理器,
	 * {@code PROPAGATION_SUPPORTS}与完全没有事务稍有不同,因为它定义了可能应用同步的事务范围。
	 * 因此,相同的资源(JDBC {@code Connection}、Hibernate {@code Session}等)将在整个指定范围内共享。
	 *
	 * 请注意,确切的行为取决于事务管理器的实际同步配置!
	 *
	 * 通常,小心使用{@code PROPAGATION_SUPPORTS} !
	 * 特别是,不要在{@code PROPAGATION_SUPPORTS}范围内依赖
	 *  {@code PROPAGATION_REQUIRED}或{@code PROPAGATION_REQUIRES_NEW}
	 *  (这可能会导致运行时的同步冲突)。
	 *
	 * 如果这种嵌套是不可避免的,请确保适当地配置您的事务管理器(通常切换到“实际事务上的同步”)。
	 *
	 * @see AbstractPlatformTransactionManager#setTransactionSynchronization
	 * @see AbstractPlatformTransactionManager#SYNCHRONIZATION_ON_ACTUAL_TRANSACTION
	 */
	int PROPAGATION_SUPPORTS = 1;

	/**
	 * 支持当前事务;如果当前事务不存在,则抛出异常。
	 * 类似于同名的EJB事务属性。
	 * 注意,{@code PROPAGATION_MANDATORY}范围内的事务同步将始终由周围的事务驱动。
	 */
	int PROPAGATION_MANDATORY = 2;

	/**
	 * 创建一个新事务,如果存在当前事务,则挂起该事务。
	 * 类似于同名的EJB事务属性。
	 * 注意:实际的事务挂起不会在所有事务管理器上开箱即用。
	 * 这特别适用于{@link org.springframework.transaction.jta.JtaTransactionManager},
	 * 它需要{@code javax.transaction.TransactionManager}将其提供给 (在标准Java EE中是特定于服务器的)。
	 * {@code PROPAGATION_REQUIRES_NEW}范围总是定义自己的事务同步。
	 * 现有同步将被挂起并适当地恢复。
	 *
	 * @see JtaTransactionManager#setTransactionManager
	 */
	int PROPAGATION_REQUIRES_NEW = 3;

	/**
	 * 不支持当前事务;而是始终以非事务方式执行。
	 * 类似于同名的EJB事务属性。
	 * 注意:
	 * 实际的事务挂起不会在所有事务管理器上开箱即用。
	 * 这特别适用于{@link JtaTransactionManager},
	 * 它需要{@code javax.transaction.TransactionManager}将其提供给(在标准Java EE中是特定于服务器的)。
	 * 注意,事务同步在{@code PROPAGATION_NOT_SUPPORTED}范围内不可用。
	 * 现有同步将被挂起并适当地恢复。
	 *
	 * @see JtaTransactionManager#setTransactionManager
	 */
	int PROPAGATION_NOT_SUPPORTED = 4;

	/**
	 * 不支持当前事务;如果当前事务存在,则抛出异常。
	 * 类似于同名的EJB事务属性。
	 * 注意,事务同步在{@code PROPAGATION_NEVER}范围内不可用。
	 */
	int PROPAGATION_NEVER = 5;

	/**
	 * 如果当前事务存在,则在嵌套事务中执行,否则执行类似{@link #PROPAGATION_REQUIRED}的操作。
	 * EJB中没有类似的功能。
	 * 注意:
	 * 嵌套事务的实际创建只能在特定的事务管理器上工作。
	 * 在JDBC 3.0驱动程序中,这只适用于JDBC {@link DataSourceTransactionManager}。一些JTA提供者也可能支持嵌套事务。
	 *
	 * @see DataSourceTransactionManager
	 */
	int PROPAGATION_NESTED = 6;


	//-----------------------------------------
	// 事务隔离级别
	//-----------------------------------------

	/**
	 * 隔离级别-使用底层数据存储的默认隔离级别
	 * 所有其他级别都对应于JDBC隔离级别。
	 *
	 * @see Connection
	 */
	int ISOLATION_DEFAULT = -1;

	/**
	 * 隔离级别-读未提交。
	 * 可以读取其他事务未提交的数据。
	 *
	 * 指示可能发生脏读(dirty reads)、不可重复读(non-repeatable reads)和幻像读(phantom reads)。
	 * 这个级别允许一个事务更改的行在提交该行中的任何更改之前被另一个事务读取(“脏读”)。
	 * 如果任何更改被回滚,第二个事务将检索到无效行。
	 *
	 * @see Connection#TRANSACTION_READ_UNCOMMITTED
	 */
	int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED;

	/**
	 * 隔离级别-读已提交。
	 *
	 * 指示禁止脏读(dirty reads);可能会发生不可重复读取(non-repeatable reads)和幻像读取(phantom reads)。
	 * 此级别仅禁止事务读取包含未提交更改的行。
     *
	 * @see Connection#TRANSACTION_READ_COMMITTED
	 */
	int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED;

	/**
	 * 隔离级别-可重复读。
	 *
	 * 指示防止脏读(dirty reads)和不可重复读(non-repeatable reads);可以发生幻像读(phantom reads)。
	 * 该级别禁止事务读取其中未提交更改的行,
	 * 它还禁止了一个事务读取一行的情况,
	 * 第二个事务修改行,第一个事务重新读取行,
	 * 第二次获得不同的值(“不可重复读取”)。
	 *
	 * @see Connection#TRANSACTION_REPEATABLE_READ
	 */
	int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ;

	/**
	 * 隔离级别-顺序读。
	 *
	 * 指示阻止脏读(dirty reads)、不可重复读(non-repeatable reads)和幻读(phantom reads)。
	 * 该级别包括{@link #ISOLATION_REPEATABLE_READ}中的禁令,并进一步禁止一个事务读取满足{@code WHERE}条件的所有行,
	 * 第二个事务插入一个满足{@code WHERE}条件的行,
	 * 对于相同的条件,第一个事务重新读取,
	 * 在第二次读取中检索附加的“幻像”行。
	 *
	 * @see Connection#TRANSACTION_SERIALIZABLE
	 */
	int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE;

	/**
	 * 使用底层事务系统的默认超时,如果不支持超时,则不支持。
	 */
	int TIMEOUT_DEFAULT = -1;

	/**
	 * Return the propagation behavior.
	 * 返回传播行为。
	 * 必须返回在{@link TransactionDefinition}这个接口上定义的{@code PROPAGATION_XXX}常量之一。
	 *
	 * @return the propagation behavior
	 * @see #PROPAGATION_REQUIRED
	 * @see org.springframework.transaction.support.TransactionSynchronizationManager#isActualTransactionActive()
	 */
	int getPropagationBehavior();

	/**
	 * Return the isolation level.
	 * 返回隔离级别。
	 *
	 * 必须返回在 {@link TransactionDefinition} 这个接口上定义的{@code ISOLATION_XXX}常量之一。
	 * 这些常量用于匹配{@link Connection}上相同常量的值。
	 *
	 * 专门设计用于{@link #PROPAGATION_REQUIRED}或{@link #PROPAGATION_REQUIRES_NEW},因为它只适用于新启动的事务。
	 * 如果您希望在参与具有不同隔离级别的现有事务时拒绝隔离级别声明,
	 * 请考虑将您的事务管理器上的“validateExistingTransactions”标志切换为“true”。
	 *
	 * 请注意,不支持自定义隔离级别的事务管理器在给出除{@link #ISOLATION_DEFAULT}之外的任何其他级别时将抛出异常。
	 *
	 * @return the isolation level
	 * @see #ISOLATION_DEFAULT
	 * @see org.springframework.transaction.support.AbstractPlatformTransactionManager#setValidateExistingTransaction
	 */
	int getIsolationLevel();

	/**
	 * 返回事务超时。
	 * 必须返回秒数,或者{@link #TIMEOUT_DEFAULT}。
	 * 专门设计用于{@link #PROPAGATION_REQUIRED}或{@link #PROPAGATION_REQUIRES_NEW},因为它只适用于新启动的事务。
	 * 注意,不支持超时的事务管理器在给出除{@link #TIMEOUT_DEFAULT}之外的其他超时时将抛出异常。
	 *
	 * @return the transaction timeout
	 */
	int getTimeout();

	/**
	 * 返回是否优化为只读事务。
	 * 只读标志适用于任何事务上下文,无论是由实际的资源事务({@link #PROPAGATION_REQUIRED}/{@link #PROPAGATION_REQUIRES_NEW})
	 * 还是在资源级别上进行非事务操作({@link #PROPAGATION_SUPPORTS})。
	 *
	 * 在后一种情况下,该标记将仅应用于应用程序内的托管资源,如Hibernate {@code Session}。
	 * 这只是作为实际事务子系统的提示;
	 * 它不一定会导致写访问尝试失败。
	 * 不能解释只读提示的事务管理器在请求只读事务时不会抛出异常。
	 *
	 * @return {@code true} if the transaction is to be optimized as read-only
	 * @see org.springframework.transaction.support.TransactionSynchronization#beforeCommit(boolean)
	 * @see org.springframework.transaction.support.TransactionSynchronizationManager#isCurrentTransactionReadOnly()
	 */
	boolean isReadOnly();

	/**
	 * 返回此事务的名称。可以是{@code null}。
	 * 这将被用作事务监视器中显示的事务名称(如果适用的话)(例如,WebLogic的)。
	 * 对于Spring的声明性事务,公开的名称将是{@code 完全限定类名 + "." + 方法名}(默认)。
	 *
	 * @return the name of this transaction
	 * @see org.springframework.transaction.interceptor.TransactionAspectSupport
	 * @see org.springframework.transaction.support.TransactionSynchronizationManager#getCurrentTransactionName()
	 */
	@Nullable
	String getName();

}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!