Class PGXAConnection

  • All Implemented Interfaces:
    javax.sql.PooledConnection, javax.sql.XAConnection, javax.transaction.xa.XAResource

    public class PGXAConnection
    extends PGPooledConnection
    implements javax.sql.XAConnection, javax.transaction.xa.XAResource
    The PostgreSQL implementation of XAResource.

    This implementation doesn't support transaction interleaving (see JTA specification, section 3.4.4) and suspend/resume.

    Two-phase commit requires PostgreSQL server version 8.1 or higher.

    • Field Detail

      • LOGGER

        private static final java.util.logging.Logger LOGGER
      • conn

        private final BaseConnection conn
        Underlying physical database connection. It's used for issuing PREPARE TRANSACTION/ COMMIT PREPARED/ROLLBACK PREPARED commands.
      • currentXid

        private javax.transaction.xa.Xid currentXid
      • preparedXid

        private javax.transaction.xa.Xid preparedXid
      • committedOrRolledBack

        private boolean committedOrRolledBack
      • localAutoCommitMode

        private boolean localAutoCommitMode
    • Constructor Detail

      • PGXAConnection

        public PGXAConnection​(BaseConnection conn)
                       throws java.sql.SQLException
        Throws:
        java.sql.SQLException
    • Method Detail

      • debug

        private void debug​(java.lang.String s)
      • getConnection

        public java.sql.Connection getConnection()
                                          throws java.sql.SQLException
        XAConnection interface.
        Specified by:
        getConnection in interface javax.sql.PooledConnection
        Overrides:
        getConnection in class PGPooledConnection
        Throws:
        java.sql.SQLException
      • getXAResource

        public javax.transaction.xa.XAResource getXAResource()
        Specified by:
        getXAResource in interface javax.sql.XAConnection
      • start

        public void start​(javax.transaction.xa.Xid xid,
                          int flags)
                   throws javax.transaction.xa.XAException
        Preconditions:
        1. Flags must be one of TMNOFLAGS, TMRESUME or TMJOIN
        2. xid != null
        3. Connection must not be associated with a transaction
        4. The TM hasn't seen the xid before

        Implementation deficiency preconditions:

        1. TMRESUME not supported.
        2. If flags is TMJOIN, we must be in ended state, and xid must be the current transaction
        3. Unless flags is TMJOIN, previous transaction using the connection must be committed or prepared or rolled back

        Postconditions:

        1. Connection is associated with the transaction
        Specified by:
        start in interface javax.transaction.xa.XAResource
        Throws:
        javax.transaction.xa.XAException
      • end

        public void end​(javax.transaction.xa.Xid xid,
                        int flags)
                 throws javax.transaction.xa.XAException
        Preconditions:
        1. Flags is one of TMSUCCESS, TMFAIL, TMSUSPEND
        2. xid != null
        3. Connection is associated with transaction xid

        Implementation deficiency preconditions:

        1. Flags is not TMSUSPEND

        Postconditions:

        1. Connection is disassociated from the transaction.
        Specified by:
        end in interface javax.transaction.xa.XAResource
        Throws:
        javax.transaction.xa.XAException
      • prepare

        public int prepare​(javax.transaction.xa.Xid xid)
                    throws javax.transaction.xa.XAException
        Prepares transaction. Preconditions:
        1. xid != null
        2. xid is in ended state

        Implementation deficiency preconditions:

        1. xid was associated with this connection

        Postconditions:

        1. Transaction is prepared
        Specified by:
        prepare in interface javax.transaction.xa.XAResource
        Throws:
        javax.transaction.xa.XAException
      • recover

        public javax.transaction.xa.Xid[] recover​(int flag)
                                           throws javax.transaction.xa.XAException
        Recovers transaction. Preconditions:
        1. flag must be one of TMSTARTRSCAN, TMENDRSCAN, TMNOFLAGS or TMSTARTTRSCAN | TMENDRSCAN
        2. If flag isn't TMSTARTRSCAN or TMSTARTRSCAN | TMENDRSCAN, a recovery scan must be in progress

        Postconditions:

        1. list of prepared xids is returned
        Specified by:
        recover in interface javax.transaction.xa.XAResource
        Throws:
        javax.transaction.xa.XAException
      • rollback

        public void rollback​(javax.transaction.xa.Xid xid)
                      throws javax.transaction.xa.XAException
        Preconditions:
        1. xid is known to the RM or it's in prepared state

        Implementation deficiency preconditions:

        1. xid must be associated with this connection if it's not in prepared state.

        Postconditions:

        1. Transaction is rolled back and disassociated from connection
        Specified by:
        rollback in interface javax.transaction.xa.XAResource
        Throws:
        javax.transaction.xa.XAException
      • commit

        public void commit​(javax.transaction.xa.Xid xid,
                           boolean onePhase)
                    throws javax.transaction.xa.XAException
        Specified by:
        commit in interface javax.transaction.xa.XAResource
        Throws:
        javax.transaction.xa.XAException
      • commitOnePhase

        private void commitOnePhase​(javax.transaction.xa.Xid xid)
                             throws javax.transaction.xa.XAException
        Preconditions:
        1. xid must in ended state.

        Implementation deficiency preconditions:

        1. this connection must have been used to run the transaction

        Postconditions:

        1. Transaction is committed
        Throws:
        javax.transaction.xa.XAException
      • commitPrepared

        private void commitPrepared​(javax.transaction.xa.Xid xid)
                             throws javax.transaction.xa.XAException
        Commits prepared transaction. Preconditions:
        1. xid must be in prepared state in the server

        Implementation deficiency preconditions:

        1. Connection must be in idle state

        Postconditions:

        1. Transaction is committed
        Throws:
        javax.transaction.xa.XAException
      • isSameRM

        public boolean isSameRM​(javax.transaction.xa.XAResource xares)
                         throws javax.transaction.xa.XAException
        Specified by:
        isSameRM in interface javax.transaction.xa.XAResource
        Throws:
        javax.transaction.xa.XAException
      • forget

        public void forget​(javax.transaction.xa.Xid xid)
                    throws javax.transaction.xa.XAException
        Does nothing, since we don't do heuristics.
        Specified by:
        forget in interface javax.transaction.xa.XAResource
        Throws:
        javax.transaction.xa.XAException
      • getTransactionTimeout

        public int getTransactionTimeout()
        We don't do transaction timeouts. Just returns 0.
        Specified by:
        getTransactionTimeout in interface javax.transaction.xa.XAResource
      • setTransactionTimeout

        public boolean setTransactionTimeout​(int seconds)
        We don't do transaction timeouts. Returns false.
        Specified by:
        setTransactionTimeout in interface javax.transaction.xa.XAResource
      • mapSQLStateToXAErrorCode

        private static int mapSQLStateToXAErrorCode​(java.sql.SQLException sqlException)
      • isPostgreSQLIntegrityConstraintViolation

        private static boolean isPostgreSQLIntegrityConstraintViolation​(java.sql.SQLException sqlException)