spring事务传播属性,隔离级别

来源:互联网 发布:淘宝买lol账号安全吗 编辑:程序博客网 时间:2024/05/16 13:55
package org.springframework.transaction;import java.sql.Connection;/** * Interface that defines Spring-compliant transaction properties. * Based on the propagation behavior definitions analogous to EJB CMT attributes. * * <p>Note that isolation level and timeout settings will not get applied unless * an actual new transaction gets started. As only {@link #PROPAGATION_REQUIRED}, * {@link #PROPAGATION_REQUIRES_NEW} and {@link #PROPAGATION_NESTED} can cause * that, it usually doesn't make sense to specify those settings in other cases. * Furthermore, be aware that not all transaction managers will support those * advanced features and thus might throw corresponding exceptions when given * non-default values. * * <p>The {@link #isReadOnly() read-only flag} applies to any transaction context, * whether backed by an actual resource transaction or operating non-transactionally * at the resource level. In the latter case, the flag will only apply to managed * resources within the application, such as a Hibernate <code>Session</code>. * * @author Juergen Hoeller * @since 08.05.2003 * @see PlatformTransactionManager#getTransaction(TransactionDefinition) * @see org.springframework.transaction.support.DefaultTransactionDefinition * @see org.springframework.transaction.interceptor.TransactionAttribute */public interface TransactionDefinition {//事务的传播属性/** * Support a current transaction; create a new one if none exists. * 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。 REQUIRED(必需的) */int PROPAGATION_REQUIRED = 0;/** * Support a current transaction; execute non-transactionally if none exists. * 支持当前事务,如果当前没有事务,就以非事务方式执行 */int PROPAGATION_SUPPORTS = 1;/** * Support a current transaction; throw an exception if no current transaction * exists.  * 支持当前事务,如果当前没有事务,就抛出异常   MANDATORY(强制的) */int PROPAGATION_MANDATORY = 2;/** * Create a new transaction, suspending the current transaction if one exists. * 新建事务,如果当前存在事务,把当前事务挂起 * 一旦内层事务进行了提交后,外层事务不能对其进行回滚 * 两个事务互不影响 */int PROPAGATION_REQUIRES_NEW = 3;/** * Do not support a current transaction; rather always execute non-transactionally. * 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起 */int PROPAGATION_NOT_SUPPORTED = 4;/** * Do not support a current transaction; throw an exception if a current transaction * exists.  * 以非事务方式执行,如果当前存在事务,则抛出异常。  */int PROPAGATION_NEVER = 5;/** * Execute within a nested transaction if a current transaction exists, * 支持当前事务,新增Savepoint点,与当前事务同步提交或回滚。  * 嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。 * 外层事务失败时,会回滚内层事务所做的动作,而内层事务操作失败并不会引起外层事务的回滚。 */int PROPAGATION_NESTED = 6;//事务的隔离级别/** * 使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应  */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;/** * Use the default timeout of the underlying transaction system, * or none if timeouts are not supported.  */int TIMEOUT_DEFAULT = -1;/** * Return the propagation behavior. * <p>Must return one of the <code>PROPAGATION_XXX</code> constants * defined on {@link TransactionDefinition this interface}. * @return the propagation behavior * @see #PROPAGATION_REQUIRED * @see org.springframework.transaction.support.TransactionSynchronizationManager#isActualTransactionActive() */int getPropagationBehavior();/** * Return the isolation level. * <p>Must return one of the <code>ISOLATION_XXX</code> constants * defined on {@link TransactionDefinition this interface}. * <p>Only makes sense in combination with {@link #PROPAGATION_REQUIRED} * or {@link #PROPAGATION_REQUIRES_NEW}. * <p>Note that a transaction manager that does not support custom isolation levels * will throw an exception when given any other level than {@link #ISOLATION_DEFAULT}. * @return the isolation level */int getIsolationLevel();/** * Return the transaction timeout. * <p>Must return a number of seconds, or {@link #TIMEOUT_DEFAULT}. * <p>Only makes sense in combination with {@link #PROPAGATION_REQUIRED} * or {@link #PROPAGATION_REQUIRES_NEW}. * <p>Note that a transaction manager that does not support timeouts will throw * an exception when given any other timeout than {@link #TIMEOUT_DEFAULT}. * @return the transaction timeout */int getTimeout();/** * Return whether to optimize as a read-only transaction. * <p>The read-only flag applies to any transaction context, whether * backed by an actual resource transaction * ({@link #PROPAGATION_REQUIRED}/{@link #PROPAGATION_REQUIRES_NEW}) or * operating non-transactionally at the resource level * ({@link #PROPAGATION_SUPPORTS}). In the latter case, the flag will * only apply to managed resources within the application, such as a * Hibernate <code>Session</code>.<< * <p>This just serves as a hint for the actual transaction subsystem; * it will <i>not necessarily</i> cause failure of write access attempts. * A transaction manager which cannot interpret the read-only hint will * <i>not</i> throw an exception when asked for a read-only transaction. * @return <code>true</code> 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();/** * Return the name of this transaction. Can be <code>null</code>. * <p>This will be used as the transaction name to be shown in a * transaction monitor, if applicable (for example, WebLogic's). * <p>In case of Spring's declarative transactions, the exposed name will be * the <code>fully-qualified class name + "." + method name</code> (by default). * @return the name of this transaction * @see org.springframework.transaction.interceptor.TransactionAspectSupport * @see org.springframework.transaction.support.TransactionSynchronizationManager#getCurrentTransactionName() */String getName();}


原创粉丝点击