org.springframework.jdbc.datasource

## Class IsolationLevelDataSourceAdapter

- java.lang.Object
- - org.springframework.jdbc.datasource.DelegatingDataSource
  - - org.springframework.jdbc.datasource.UserCredentialsDataSourceAdapter
    - - org.springframework.jdbc.datasource.IsolationLevelDataSourceAdapter

- All Implemented Interfaces:
    Wrapper, CommonDataSource, DataSource, InitializingBean
  Direct Known Subclasses:
    WebSphereDataSourceAdapter

      public class IsolationLevelDataSourceAdapter
      extends UserCredentialsDataSourceAdapter

  An adapter for a target `DataSource`, applying the current Spring transaction's isolation level (and potentially specified user credentials) to every `getConnection` call. Also applies the read-only flag, if specified.

  Can be used to proxy a target JNDI DataSource that does not have the desired isolation level (and user credentials) configured. Client code can work with this DataSource as usual, not worrying about such settings.

  Inherits the capability to apply specific user credentials from its superclass `UserCredentialsDataSourceAdapter`; see the latter's javadoc for details on that functionality (e.g. `UserCredentialsDataSourceAdapter.setCredentialsForCurrentThread(java.lang.String, java.lang.String)`).

  WARNING: This adapter simply calls `Connection.setTransactionIsolation(int)` and/or `Connection.setReadOnly(boolean)` for every Connection obtained from it. It does, however, not reset those settings; it rather expects the target DataSource to perform such resetting as part of its connection pool handling. Make sure that the target DataSource properly cleans up such transaction state.

  Since:
    2.0.3
  Author:
    Juergen Hoeller
  See Also:
    `setIsolationLevel(int)`, `setIsolationLevelName(java.lang.String)`, `UserCredentialsDataSourceAdapter.setUsername(java.lang.String)`, `UserCredentialsDataSourceAdapter.setPassword(java.lang.String)`

- - ### Constructor Summary

    Constructors
    Constructor and Description
    `IsolationLevelDataSourceAdapter()`

  - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `protected Connection` | `doGetConnection(String username, String password)` Applies the current isolation level value and read-only flag to the returned Connection.
    `protected Integer` | `getCurrentIsolationLevel()` Determine the current isolation level: either the transaction's isolation level or a statically defined isolation level.
    `protected Boolean` | `getCurrentReadOnlyFlag()` Determine the current read-only flag: by default, the transaction's read-only hint.
    `protected Integer` | `getIsolationLevel()` Return the statically specified isolation level, or `null` if none.
    `void` | `setIsolationLevel(int isolationLevel)` Specify the default isolation level to use for Connection retrieval, according to the JDBC `Connection` constants (equivalent to the corresponding Spring `TransactionDefinition` constants).
    `void` | `setIsolationLevelName(String constantName)` Set the default isolation level by the name of the corresponding constant in `TransactionDefinition`, e.g.

    - ### Methods inherited from class org.springframework.jdbc.datasource.UserCredentialsDataSourceAdapter

      `getConnection, getConnection, removeCredentialsFromCurrentThread, setCredentialsForCurrentThread, setPassword, setUsername`

    - ### Methods inherited from class org.springframework.jdbc.datasource.DelegatingDataSource

      `afterPropertiesSet, getLoginTimeout, getLogWriter, getParentLogger, getTargetDataSource, isWrapperFor, setLoginTimeout, setLogWriter, setTargetDataSource, unwrap`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Constructor Detail

    - #### IsolationLevelDataSourceAdapter

          public IsolationLevelDataSourceAdapter()

  - ### Method Detail

    - #### setIsolationLevelName

          public final void setIsolationLevelName(String constantName)
                                           throws IllegalArgumentException

      Set the default isolation level by the name of the corresponding constant in `TransactionDefinition`, e.g. "ISOLATION_SERIALIZABLE".

      If not specified, the target DataSource's default will be used. Note that a transaction-specific isolation value will always override any isolation setting specified at the DataSource level.

      Parameters:
        `constantName` - name of the constant
      Throws:
        `IllegalArgumentException`
      See Also:
        `TransactionDefinition.ISOLATION_READ_UNCOMMITTED`, `TransactionDefinition.ISOLATION_READ_COMMITTED`, `TransactionDefinition.ISOLATION_REPEATABLE_READ`, `TransactionDefinition.ISOLATION_SERIALIZABLE`, `setIsolationLevel(int)`

    - #### setIsolationLevel

          public void setIsolationLevel(int isolationLevel)

      Specify the default isolation level to use for Connection retrieval, according to the JDBC `Connection` constants (equivalent to the corresponding Spring `TransactionDefinition` constants).

      If not specified, the target DataSource's default will be used. Note that a transaction-specific isolation value will always override any isolation setting specified at the DataSource level.

      See Also:
        `Connection.TRANSACTION_READ_UNCOMMITTED`, `Connection.TRANSACTION_READ_COMMITTED`, `Connection.TRANSACTION_REPEATABLE_READ`, `Connection.TRANSACTION_SERIALIZABLE`, `TransactionDefinition.ISOLATION_READ_UNCOMMITTED`, `TransactionDefinition.ISOLATION_READ_COMMITTED`, `TransactionDefinition.ISOLATION_REPEATABLE_READ`, `TransactionDefinition.ISOLATION_SERIALIZABLE`, `TransactionDefinition.getIsolationLevel()`, `TransactionSynchronizationManager.getCurrentTransactionIsolationLevel()`

    - #### getIsolationLevel

          protected Integer getIsolationLevel()

      Return the statically specified isolation level, or `null` if none.

    - #### doGetConnection

          protected Connection doGetConnection(String username,
                                   String password)
                                        throws SQLException

      Applies the current isolation level value and read-only flag to the returned Connection.
      Overrides:
        `doGetConnection` in class `UserCredentialsDataSourceAdapter`
      Parameters:
        `username` - the username to use
        `password` - the password to use
      Returns:
        the Connection
      Throws:
        `SQLException`
      See Also:
        `getCurrentIsolationLevel()`, `getCurrentReadOnlyFlag()`

    - #### getCurrentIsolationLevel

          protected Integer getCurrentIsolationLevel()

      Determine the current isolation level: either the transaction's isolation level or a statically defined isolation level.
      Returns:
        the current isolation level, or `null` if none
      See Also:
        `TransactionSynchronizationManager.getCurrentTransactionIsolationLevel()`, `setIsolationLevel(int)`

    - #### getCurrentReadOnlyFlag

          protected Boolean getCurrentReadOnlyFlag()

      Determine the current read-only flag: by default, the transaction's read-only hint.
      Returns:
        whether there is a read-only hint for the current scope
      See Also:
        `TransactionSynchronizationManager.isCurrentTransactionReadOnly()`