org.springframework.jdbc.support

## Class JdbcTransactionManager

- java.lang.Object
- - org.springframework.transaction.support.AbstractPlatformTransactionManager
  - - org.springframework.jdbc.datasource.DataSourceTransactionManager
    - - org.springframework.jdbc.support.JdbcTransactionManager

- All Implemented Interfaces:
    Serializable, InitializingBean, PlatformTransactionManager, ResourceTransactionManager, TransactionManager

      public class JdbcTransactionManager
      extends DataSourceTransactionManager

  `JdbcAccessor`-aligned subclass of the plain `DataSourceTransactionManager`, adding common JDBC exception translation for the commit and rollback step. Typically used in combination with `JdbcTemplate` which applies the same `SQLExceptionTranslator` infrastructure by default.

  Exception translation is specifically relevant for commit steps in serializable transactions (e.g. on Postgres) where concurrency failures may occur late on commit. This allows for throwing `ConcurrencyFailureException` to callers instead of `TransactionSystemException`.

  Analogous to `HibernateTransactionManager` and `JpaTransactionManager`, this transaction manager may throw `DataAccessException` from `AbstractPlatformTransactionManager.commit(org.springframework.transaction.TransactionStatus)` and possibly also from `AbstractPlatformTransactionManager.rollback(org.springframework.transaction.TransactionStatus)`. Calling code should be prepared for handling such exceptions next to `TransactionException`, which is generally sensible since `TransactionSynchronization` implementations may also throw such exceptions in their `flush` and `beforeCommit` phases.

  Since:
    5.3
  Author:
    Juergen Hoeller, Sebastien Deleuze
  See Also:
    `DataSourceTransactionManager`, `DataSourceTransactionManager.setDataSource(javax.sql.DataSource)`, `setExceptionTranslator(org.springframework.jdbc.support.SQLExceptionTranslator)`, Serialized Form

- - ### Nested Class Summary

    - ### Nested classes/interfaces inherited from class org.springframework.transaction.support.AbstractPlatformTransactionManager

      `AbstractPlatformTransactionManager.SuspendedResourcesHolder`

  - ### Field Summary

    - ### Fields inherited from class org.springframework.transaction.support.AbstractPlatformTransactionManager

      `logger, SYNCHRONIZATION_ALWAYS, SYNCHRONIZATION_NEVER, SYNCHRONIZATION_ON_ACTUAL_TRANSACTION`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `JdbcTransactionManager()` Create a new JdbcTransactionManager instance.
    `JdbcTransactionManager(DataSource dataSource)` Create a new JdbcTransactionManager instance.

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `void` | `afterPropertiesSet()` Eagerly initialize the exception translator, if demanded, creating a default one for the specified DataSource if none set.
    `SQLExceptionTranslator` | `getExceptionTranslator()` Return the exception translator for this instance.
    `boolean` | `isLazyInit()` Return whether to lazily initialize the SQLExceptionTranslator for this transaction manager.
    `void` | `setDatabaseProductName(String dbName)` Specify the database product name for the DataSource that this transaction manager uses.
    `void` | `setExceptionTranslator(SQLExceptionTranslator exceptionTranslator)` Set the exception translator for this instance.
    `void` | `setLazyInit(boolean lazyInit)` Set whether to lazily initialize the SQLExceptionTranslator for this transaction manager, on first encounter of an SQLException.
    `protected RuntimeException` | `translateException(String task, SQLException ex)` This implementation attempts to use the `SQLExceptionTranslator`, falling back to a `TransactionSystemException`.

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

      `doBegin, doCleanupAfterCompletion, doCommit, doGetTransaction, doResume, doRollback, doSetRollbackOnly, doSuspend, getDataSource, getResourceFactory, isEnforceReadOnly, isExistingTransaction, obtainDataSource, prepareTransactionalConnection, setDataSource, setEnforceReadOnly`

    - ### Methods inherited from class org.springframework.transaction.support.AbstractPlatformTransactionManager

      `commit, determineTimeout, getDefaultTimeout, getTransaction, getTransactionSynchronization, invokeAfterCompletion, isFailEarlyOnGlobalRollbackOnly, isGlobalRollbackOnParticipationFailure, isNestedTransactionAllowed, isRollbackOnCommitFailure, isValidateExistingTransaction, newTransactionStatus, prepareForCommit, prepareSynchronization, prepareTransactionStatus, registerAfterCompletionWithExistingTransaction, resume, rollback, setDefaultTimeout, setFailEarlyOnGlobalRollbackOnly, setGlobalRollbackOnParticipationFailure, setNestedTransactionAllowed, setRollbackOnCommitFailure, setTransactionSynchronization, setTransactionSynchronizationName, setValidateExistingTransaction, shouldCommitOnGlobalRollbackOnly, suspend, triggerBeforeCommit, triggerBeforeCompletion, useSavepointForNestedTransaction`

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

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

    - ### Methods inherited from interface org.springframework.transaction.PlatformTransactionManager

      `commit, getTransaction, rollback`

- - ### Constructor Detail

    - #### JdbcTransactionManager

          public JdbcTransactionManager()

      Create a new JdbcTransactionManager instance. A DataSource has to be set to be able to use it.
      See Also:
        `DataSourceTransactionManager.setDataSource(javax.sql.DataSource)`

    - #### JdbcTransactionManager

          public JdbcTransactionManager(DataSource dataSource)

      Create a new JdbcTransactionManager instance.
      Parameters:
        `dataSource` - the JDBC DataSource to manage transactions for

  - ### Method Detail

    - #### setDatabaseProductName

          public void setDatabaseProductName(String dbName)

      Specify the database product name for the DataSource that this transaction manager uses. This allows to initialize an SQLErrorCodeSQLExceptionTranslator without obtaining a Connection from the DataSource to get the meta-data.
      Parameters:
        `dbName` - the database product name that identifies the error codes entry
      See Also:
        `JdbcAccessor.setDatabaseProductName(java.lang.String)`, `SQLErrorCodeSQLExceptionTranslator.setDatabaseProductName(java.lang.String)`, `DatabaseMetaData.getDatabaseProductName()`

    - #### setExceptionTranslator

          public void setExceptionTranslator(SQLExceptionTranslator exceptionTranslator)

      Set the exception translator for this instance.

      If no custom translator is provided, a default `SQLErrorCodeSQLExceptionTranslator` is used which examines the SQLException's vendor-specific error code.

      See Also:
        `JdbcAccessor.setExceptionTranslator(org.springframework.jdbc.support.SQLExceptionTranslator)`, `SQLErrorCodeSQLExceptionTranslator`

    - #### getExceptionTranslator

          public SQLExceptionTranslator getExceptionTranslator()

      Return the exception translator for this instance.

      Creates a default `SQLErrorCodeSQLExceptionTranslator` for the specified DataSource if none set.

      See Also:
        `DataSourceTransactionManager.getDataSource()`

    - #### setLazyInit

          public void setLazyInit(boolean lazyInit)

      Set whether to lazily initialize the SQLExceptionTranslator for this transaction manager, on first encounter of an SQLException. Default is "true"; can be switched to "false" for initialization on startup.

      Early initialization just applies if `afterPropertiesSet()` is called.

      See Also:
        `getExceptionTranslator()`, `afterPropertiesSet()`

    - #### isLazyInit

          public boolean isLazyInit()

      Return whether to lazily initialize the SQLExceptionTranslator for this transaction manager.
      See Also:
        `getExceptionTranslator()`

    - #### afterPropertiesSet

          public void afterPropertiesSet()

      Eagerly initialize the exception translator, if demanded, creating a default one for the specified DataSource if none set.
      Specified by:
        `afterPropertiesSet` in interface `InitializingBean`
      Overrides:
        `afterPropertiesSet` in class `DataSourceTransactionManager`

    - #### translateException

          protected RuntimeException translateException(String task,
                                                        SQLException ex)

      This implementation attempts to use the `SQLExceptionTranslator`, falling back to a `TransactionSystemException`.
      Overrides:
        `translateException` in class `DataSourceTransactionManager`
      Parameters:
        `task` - the task description (commit or rollback)
        `ex` - the SQLException thrown from commit/rollback
      Returns:
        the translated exception to throw, either a `DataAccessException` or a `TransactionException`
      See Also:
        `getExceptionTranslator()`, `DataSourceTransactionManager.translateException(java.lang.String, java.sql.SQLException)`