Package org.postgresql.xa
Class PGXAConnection
- java.lang.Object
-
- org.postgresql.ds.PGPooledConnection
-
- org.postgresql.xa.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 ofXAResource
.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.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private class
PGXAConnection.ConnectionHandler
private static class
PGXAConnection.State
-
Field Summary
Fields Modifier and Type Field Description private boolean
committedOrRolledBack
private BaseConnection
conn
Underlying physical database connection.private javax.transaction.xa.Xid
currentXid
private boolean
localAutoCommitMode
private static java.util.logging.Logger
LOGGER
private javax.transaction.xa.Xid
preparedXid
private PGXAConnection.State
state
-
Constructor Summary
Constructors Constructor Description PGXAConnection(BaseConnection conn)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description void
commit(javax.transaction.xa.Xid xid, boolean onePhase)
private void
commitOnePhase(javax.transaction.xa.Xid xid)
Preconditions: xid must in ended state.private void
commitPrepared(javax.transaction.xa.Xid xid)
Commits prepared transaction.private void
debug(java.lang.String s)
void
end(javax.transaction.xa.Xid xid, int flags)
Preconditions: Flags is one of TMSUCCESS, TMFAIL, TMSUSPEND xid != null Connection is associated with transaction xidvoid
forget(javax.transaction.xa.Xid xid)
Does nothing, since we don't do heuristics.java.sql.Connection
getConnection()
XAConnection interface.int
getTransactionTimeout()
We don't do transaction timeouts.javax.transaction.xa.XAResource
getXAResource()
private static boolean
isPostgreSQLIntegrityConstraintViolation(java.sql.SQLException sqlException)
boolean
isSameRM(javax.transaction.xa.XAResource xares)
private static int
mapSQLStateToXAErrorCode(java.sql.SQLException sqlException)
int
prepare(javax.transaction.xa.Xid xid)
Prepares transaction.javax.transaction.xa.Xid[]
recover(int flag)
Recovers transaction.void
rollback(javax.transaction.xa.Xid xid)
Preconditions: xid is known to the RM or it's in prepared stateboolean
setTransactionTimeout(int seconds)
We don't do transaction timeouts.void
start(javax.transaction.xa.Xid xid, int flags)
Preconditions: Flags must be one of TMNOFLAGS, TMRESUME or TMJOIN xid != null Connection must not be associated with a transaction The TM hasn't seen the xid before-
Methods inherited from class org.postgresql.ds.PGPooledConnection
addConnectionEventListener, addStatementEventListener, close, createConnectionEvent, removeConnectionEventListener, removeStatementEventListener
-
-
-
-
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
-
state
private PGXAConnection.State state
-
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 interfacejavax.sql.PooledConnection
- Overrides:
getConnection
in classPGPooledConnection
- Throws:
java.sql.SQLException
-
getXAResource
public javax.transaction.xa.XAResource getXAResource()
- Specified by:
getXAResource
in interfacejavax.sql.XAConnection
-
start
public void start(javax.transaction.xa.Xid xid, int flags) throws javax.transaction.xa.XAException
Preconditions:- Flags must be one of TMNOFLAGS, TMRESUME or TMJOIN
- xid != null
- Connection must not be associated with a transaction
- The TM hasn't seen the xid before
Implementation deficiency preconditions:
- TMRESUME not supported.
- If flags is TMJOIN, we must be in ended state, and xid must be the current transaction
- Unless flags is TMJOIN, previous transaction using the connection must be committed or prepared or rolled back
Postconditions:
- Connection is associated with the transaction
- Specified by:
start
in interfacejavax.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:- Flags is one of TMSUCCESS, TMFAIL, TMSUSPEND
- xid != null
- Connection is associated with transaction xid
Implementation deficiency preconditions:
- Flags is not TMSUSPEND
Postconditions:
- Connection is disassociated from the transaction.
- Specified by:
end
in interfacejavax.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:- xid != null
- xid is in ended state
Implementation deficiency preconditions:
- xid was associated with this connection
Postconditions:
- Transaction is prepared
- Specified by:
prepare
in interfacejavax.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:- flag must be one of TMSTARTRSCAN, TMENDRSCAN, TMNOFLAGS or TMSTARTTRSCAN | TMENDRSCAN
- If flag isn't TMSTARTRSCAN or TMSTARTRSCAN | TMENDRSCAN, a recovery scan must be in progress
Postconditions:
- list of prepared xids is returned
- Specified by:
recover
in interfacejavax.transaction.xa.XAResource
- Throws:
javax.transaction.xa.XAException
-
rollback
public void rollback(javax.transaction.xa.Xid xid) throws javax.transaction.xa.XAException
Preconditions:- xid is known to the RM or it's in prepared state
Implementation deficiency preconditions:
- xid must be associated with this connection if it's not in prepared state.
Postconditions:
- Transaction is rolled back and disassociated from connection
- Specified by:
rollback
in interfacejavax.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 interfacejavax.transaction.xa.XAResource
- Throws:
javax.transaction.xa.XAException
-
commitOnePhase
private void commitOnePhase(javax.transaction.xa.Xid xid) throws javax.transaction.xa.XAException
Preconditions:- xid must in ended state.
Implementation deficiency preconditions:
- this connection must have been used to run the transaction
Postconditions:
- 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:- xid must be in prepared state in the server
Implementation deficiency preconditions:
- Connection must be in idle state
Postconditions:
- 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 interfacejavax.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 interfacejavax.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 interfacejavax.transaction.xa.XAResource
-
setTransactionTimeout
public boolean setTransactionTimeout(int seconds)
We don't do transaction timeouts. Returns false.- Specified by:
setTransactionTimeout
in interfacejavax.transaction.xa.XAResource
-
mapSQLStateToXAErrorCode
private static int mapSQLStateToXAErrorCode(java.sql.SQLException sqlException)
-
isPostgreSQLIntegrityConstraintViolation
private static boolean isPostgreSQLIntegrityConstraintViolation(java.sql.SQLException sqlException)
-
-