All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.gemstone.gemfire.cache.IsolationLevel Maven / Gradle / Ivy

/*
 * Copyright (c) 2010-2015 Pivotal Software, Inc. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you
 * may not use this file except in compliance with the License. You
 * may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * permissions and limitations under the License. See accompanying
 * LICENSE file.
 */

package com.gemstone.gemfire.cache;

import java.sql.Connection;

import com.gemstone.gemfire.i18n.LogWriterI18n;
import com.gemstone.gemfire.internal.i18n.LocalizedStrings;

/**
 * Enumeration of the supported isolation-levels for transactions initiated by
 * {@link CacheTransactionManager}.
 * 
 * @author swale
 * @since 7.0
 */
public enum IsolationLevel {

  /**
   * No isolation.
   */
  NONE {

    @Override
    public final int getJdbcIsolationLevel() {
      return Connection.TRANSACTION_NONE;
    }

    @Override
    final int getAlternativeJdbcIsolationLevel() {
      return NO_ALTERNATIVE_JDBC_LEVEL;
    }
  },

  /**
   * Represents an isolation level of READ_COMMITTED.
   */
  READ_COMMITTED {

    @Override
    public final int getJdbcIsolationLevel() {
      return Connection.TRANSACTION_READ_COMMITTED;
    }

    @Override
    final int getAlternativeJdbcIsolationLevel() {
      return Connection.TRANSACTION_READ_UNCOMMITTED;
    }
  },

  /**
   * Represents an isolation level of REPEATABLE_READ.
   */
  REPEATABLE_READ {

    @Override
    public final int getJdbcIsolationLevel() {
      return Connection.TRANSACTION_REPEATABLE_READ;
    }

    @Override
    final int getAlternativeJdbcIsolationLevel() {
      return NO_ALTERNATIVE_JDBC_LEVEL;
    }
  },
  ;

  /**
   * The default isolation level is {@link #READ_COMMITTED}.
   */
  public static final IsolationLevel DEFAULT = READ_COMMITTED;

  /**
   * Get the JDBC isolation-level (i.e.
   * {@link Connection#TRANSACTION_READ_COMMITTED},
   * {@link Connection#TRANSACTION_REPEATABLE_READ} etc.) corresponding to this
   * {@link IsolationLevel}.
   */
  public abstract int getJdbcIsolationLevel();

  /**
   * Returned by {@link #getAlternativeJdbcIsolationLevel()} when no alternative
   * JDBC level is applicable that has to be upgraded to this
   * {@link IsolationLevel}.
   */
  final static int NO_ALTERNATIVE_JDBC_LEVEL = -1;

  /**
   * If some other JDBC isolation level is to be upgraded to this one, then
   * return that else return {@link #NO_ALTERNATIVE_JDBC_LEVEL}.
   */
  abstract int getAlternativeJdbcIsolationLevel();

  /**
   * Mapping of JDBC isolation-level (i.e.
   * {@link Connection#TRANSACTION_READ_COMMITTED},
   * {@link Connection#TRANSACTION_REPEATABLE_READ} etc.) to corresponding
   * {@link IsolationLevel}.
   */
  private final static IsolationLevel[] jdbcMapping;

  static {
    // initialize the jdbcMapping array by iterating through all the supported
    // isolation levels
    int max = -1;
    for (IsolationLevel level : values()) {
      final int jdbcLevel = level.getJdbcIsolationLevel();
      final int alternativeLevel = level.getAlternativeJdbcIsolationLevel();
      if (jdbcLevel > max) {
        max = jdbcLevel;
      }
      if (alternativeLevel != NO_ALTERNATIVE_JDBC_LEVEL
          && alternativeLevel > max) {
        max = alternativeLevel;
      }
    }
    jdbcMapping = new IsolationLevel[max + 1];
    for (IsolationLevel level : values()) {
      jdbcMapping[level.getJdbcIsolationLevel()] = level;
      final int alternativeLevel = level.getAlternativeJdbcIsolationLevel();
      if (alternativeLevel != NO_ALTERNATIVE_JDBC_LEVEL) {
        jdbcMapping[alternativeLevel] = level;
      }
    }
  }

  /**
   * Get the {@link IsolationLevel} given the JDBC isolation-level (i.e.
   * {@link Connection#TRANSACTION_READ_COMMITTED},
   * {@link Connection#TRANSACTION_REPEATABLE_READ} etc.).
   * 
   * @param jdbcIsolationLevel
   *          the JDBC isolation level (e.g.
   *          {@link Connection#TRANSACTION_READ_COMMITTED})
   * @param logWarningIfUpgraded
   *          if the given JDBC isolation level is upgraded and returned, then
   *          log a warning using this {@link LogWriterI18n} if non-null;
   *          currently this only happens when
   *          {@link Connection#TRANSACTION_READ_UNCOMMITTED} is upgraded to
   *          {@link IsolationLevel#READ_COMMITTED}.
   */
  public final static IsolationLevel fromJdbcIsolationLevel(
      final int jdbcIsolationLevel, final LogWriterI18n logWarningIfUpgraded) {
    final IsolationLevel level;
    if (jdbcIsolationLevel >= 0 && jdbcIsolationLevel < jdbcMapping.length
        && (level = jdbcMapping[jdbcIsolationLevel]) != null) {
      if (logWarningIfUpgraded != null
          && level.getJdbcIsolationLevel() != jdbcIsolationLevel) {
        logWarningIfUpgraded.warning(
            LocalizedStrings.Transaction_ISOLATION_IMPLICIT_UPGRADE,
            new Object[] { jdbcIsolationLevel, level });
      }
      return level;
    }
    throw new UnsupportedOperationException("Unsupported JDBC isolation level "
        + jdbcIsolationLevel);
  }

  /**
   * Get the {@link IsolationLevel} corresponding to the ordinal value obtained
   * from {@link IsolationLevel#ordinal()}.
   */
  public final static IsolationLevel fromOrdinal(final int ordinal) {
    return values()[ordinal];
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy