Class DataSourceTransactionManager

java.lang.Object
io.micronaut.transaction.support.AbstractPropagatedStatusTransactionOperations<T,C>
io.micronaut.transaction.support.AbstractTransactionOperations<io.micronaut.transaction.impl.DefaultTransactionStatus<C>,C>
io.micronaut.transaction.support.AbstractDefaultTransactionOperations<Connection>
io.micronaut.transaction.jdbc.DataSourceTransactionManager
All Implemented Interfaces:
io.micronaut.transaction.SynchronousTransactionManager<Connection>, io.micronaut.transaction.TransactionManager, io.micronaut.transaction.TransactionOperations<Connection>

@Internal @EachBean(javax.sql.DataSource.class) @Requires(condition=io.micronaut.transaction.jdbc.JdbcTransactionManagerCondition.class) public final class DataSourceTransactionManager extends io.micronaut.transaction.support.AbstractDefaultTransactionOperations<Connection>
The DataSource transaction manager. Partially based on https://github.com/spring-projects/spring-framework/blob/main/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/DataSourceTransactionManager.java
Since:
4.0.0
  • Field Summary

    Fields inherited from class io.micronaut.transaction.support.AbstractTransactionOperations

    connectionOperations, logger, synchronousConnectionManager
  • Constructor Summary

    Constructors
    Constructor
    Description
    DataSourceTransactionManager(@NonNull DataSource dataSource, io.micronaut.data.connection.ConnectionOperations<Connection> connectionOperations, @Nullable io.micronaut.data.connection.SynchronousConnectionManager<Connection> synchronousConnectionManager)
    Create a new DataSourceTransactionManager instance.
  • Method Summary

    Modifier and Type
    Method
    Description
    protected void
    doBegin(io.micronaut.transaction.impl.DefaultTransactionStatus<Connection> status)
     
    protected void
    doCommit(io.micronaut.transaction.impl.DefaultTransactionStatus<Connection> status)
     
    protected void
    doNestedBegin(io.micronaut.transaction.impl.DefaultTransactionStatus<Connection> status)
     
    protected void
    doNestedCommit(io.micronaut.transaction.impl.DefaultTransactionStatus<Connection> status)
     
    protected void
    doNestedRollback(io.micronaut.transaction.impl.DefaultTransactionStatus<Connection> status)
     
    protected void
    doRollback(io.micronaut.transaction.impl.DefaultTransactionStatus<Connection> status)
     
    @NonNull Connection
     
    @NonNull DataSource
     
    boolean
     
    protected void
    prepareTransactionalConnection(Connection con, io.micronaut.transaction.TransactionDefinition definition)
    Prepare the transactional Connection right after transaction begin.
    void
    setEnforceReadOnly(boolean enforceReadOnly)
    Specify whether to enforce the read-only nature of a transaction (as indicated by TransactionDefinition.isReadOnly()) through an explicit statement on the transactional connection: "SET TRANSACTION READ ONLY" as understood by Oracle, MySQL and Postgres.

    Methods inherited from class io.micronaut.transaction.support.AbstractDefaultTransactionOperations

    createExistingTransactionStatus, createNewTransactionStatus, createNoTxTransactionStatus

    Methods inherited from class io.micronaut.transaction.support.AbstractTransactionOperations

    commit, determineTimeout, doExecute, doResume, doSuspend, getConnectionDefinition, getTransaction, hasConnection, rollback, suspend

    Methods inherited from class io.micronaut.transaction.support.AbstractPropagatedStatusTransactionOperations

    execute, extendCurrentPropagatedContext, findTransactionStatus

    Methods inherited from class java.lang.Object

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

    Methods inherited from interface io.micronaut.transaction.TransactionOperations

    execute, executeRead, executeWrite, findTransactionStatus
  • Constructor Details

    • DataSourceTransactionManager

      public DataSourceTransactionManager(@NonNull @NonNull DataSource dataSource, @Parameter io.micronaut.data.connection.ConnectionOperations<Connection> connectionOperations, @Parameter @Nullable @Nullable io.micronaut.data.connection.SynchronousConnectionManager<Connection> synchronousConnectionManager)
      Create a new DataSourceTransactionManager instance.
      Parameters:
      dataSource - the JDBC DataSource to manage transactions for
      connectionOperations - the connection operations
      synchronousConnectionManager - the synchronous connection operations
  • Method Details

    • getDataSource

      @NonNull public @NonNull DataSource getDataSource()
      Returns:
      Return the JDBC DataSource that this instance manages transactions for.
    • setEnforceReadOnly

      public void setEnforceReadOnly(boolean enforceReadOnly)
      Specify whether to enforce the read-only nature of a transaction (as indicated by TransactionDefinition.isReadOnly()) through an explicit statement on the transactional connection: "SET TRANSACTION READ ONLY" as understood by Oracle, MySQL and Postgres.

      The exact treatment, including any SQL statement executed on the connection, can be customized through prepareTransactionalConnection(java.sql.Connection, io.micronaut.transaction.TransactionDefinition).

      This mode of read-only handling goes beyond the Connection.setReadOnly(boolean) hint that Spring applies by default. In contrast to that standard JDBC hint, "SET TRANSACTION READ ONLY" enforces an isolation-level-like connection mode where data manipulation statements are strictly disallowed. Also, on Oracle, this read-only mode provides read consistency for the entire transaction.

      Note that older Oracle JDBC drivers (9i, 10g) used to enforce this read-only mode even for Connection.setReadOnly(true. However, with recent drivers, this strong enforcement needs to be applied explicitly, e.g. through this flag.

      Parameters:
      enforceReadOnly - True if read-only should be enforced
      Since:
      4.3.7
      See Also:
    • isEnforceReadOnly

      public boolean isEnforceReadOnly()
      Returns:
      Return whether to enforce the read-only nature of a transaction through an explicit statement on the transactional connection.
      Since:
      4.3.7
      See Also:
    • doBegin

      protected void doBegin(io.micronaut.transaction.impl.DefaultTransactionStatus<Connection> status)
      Specified by:
      doBegin in class io.micronaut.transaction.support.AbstractTransactionOperations<io.micronaut.transaction.impl.DefaultTransactionStatus<Connection>,Connection>
    • doCommit

      protected void doCommit(io.micronaut.transaction.impl.DefaultTransactionStatus<Connection> status)
      Specified by:
      doCommit in class io.micronaut.transaction.support.AbstractTransactionOperations<io.micronaut.transaction.impl.DefaultTransactionStatus<Connection>,Connection>
    • doRollback

      protected void doRollback(io.micronaut.transaction.impl.DefaultTransactionStatus<Connection> status)
      Specified by:
      doRollback in class io.micronaut.transaction.support.AbstractTransactionOperations<io.micronaut.transaction.impl.DefaultTransactionStatus<Connection>,Connection>
    • doNestedBegin

      protected void doNestedBegin(io.micronaut.transaction.impl.DefaultTransactionStatus<Connection> status)
      Overrides:
      doNestedBegin in class io.micronaut.transaction.support.AbstractTransactionOperations<io.micronaut.transaction.impl.DefaultTransactionStatus<Connection>,Connection>
    • doNestedCommit

      protected void doNestedCommit(io.micronaut.transaction.impl.DefaultTransactionStatus<Connection> status)
      Overrides:
      doNestedCommit in class io.micronaut.transaction.support.AbstractTransactionOperations<io.micronaut.transaction.impl.DefaultTransactionStatus<Connection>,Connection>
    • doNestedRollback

      protected void doNestedRollback(io.micronaut.transaction.impl.DefaultTransactionStatus<Connection> status)
      Overrides:
      doNestedRollback in class io.micronaut.transaction.support.AbstractTransactionOperations<io.micronaut.transaction.impl.DefaultTransactionStatus<Connection>,Connection>
    • prepareTransactionalConnection

      protected void prepareTransactionalConnection(Connection con, io.micronaut.transaction.TransactionDefinition definition) throws SQLException
      Prepare the transactional Connection right after transaction begin.

      The default implementation executes a "SET TRANSACTION READ ONLY" statement if the "enforceReadOnly" flag is set to true and the transaction definition indicates a read-only transaction.

      The "SET TRANSACTION READ ONLY" is understood by Oracle, MySQL and Postgres and may work with other databases as well. If you'd like to adapt this treatment, override this method accordingly.

      Parameters:
      con - the transactional JDBC Connection
      definition - the current transaction definition
      Throws:
      SQLException - if thrown by JDBC API
      Since:
      4.3.7
      See Also:
    • getConnection

      @NonNull public @NonNull Connection getConnection()