com.amazon.redshift.xa

## Class RedshiftXAConnection

- java.lang.Object
- - com.amazon.redshift.ds.RedshiftPooledConnection
  - - com.amazon.redshift.xa.RedshiftXAConnection

All Implemented Interfaces:
  PooledConnection, XAConnection, XAResource

    public class RedshiftXAConnection
    extends RedshiftPooledConnection
    implements XAConnection, XAResource

The Redshift 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.

Author:
  Heikki Linnakangas (heikki.linnakangas@iki.fi)

### Field Summary

### Fields inherited from interface javax.transaction.xa.XAResource

`TMENDRSCAN, TMFAIL, TMJOIN, TMNOFLAGS, TMONEPHASE, TMRESUME, TMSTARTRSCAN, TMSUCCESS, TMSUSPEND, XA_OK, XA_RDONLY`

### Constructor Summary

Constructors
Constructor and Description
`RedshiftXAConnection(BaseConnection conn)`

### Method Summary

All Methods Instance Methods Concrete Methods
`void` `commit(Xid xid, boolean onePhase)`
`void` `end(Xid xid, int flags)` Preconditions:
`void` `forget(Xid xid)` Does nothing, since we don't do heuristics.
`Connection` `getConnection()` XAConnection interface.
`int` `getTransactionTimeout()` We don't do transaction timeouts.
`XAResource` `getXAResource()`
`boolean` `isSameRM(XAResource xares)`
`int` `prepare(Xid xid)` Prepares transaction.
`Xid[]` `recover(int flag)` Recovers transaction.
`void` `rollback(Xid xid)` Preconditions:
`boolean` `setTransactionTimeout(int seconds)` We don't do transaction timeouts.
`void` `start(Xid xid, int flags)` Preconditions:

### Methods inherited from class com.amazon.redshift.ds.RedshiftPooledConnection

`addConnectionEventListener, addStatementEventListener, close, createConnectionEvent, removeConnectionEventListener, removeStatementEventListener`

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

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

### Methods inherited from interface javax.sql.PooledConnection

`addConnectionEventListener, addStatementEventListener, close, removeConnectionEventListener, removeStatementEventListener`

### Constructor Detail

#### RedshiftXAConnection

    public RedshiftXAConnection(BaseConnection conn)
                         throws SQLException

Throws:
  `SQLException`

### Method Detail

#### getConnection

    public Connection getConnection()
                             throws SQLException

XAConnection interface.

Specified by:
  `getConnection` in interface `PooledConnection`
Overrides:
  `getConnection` in class `RedshiftPooledConnection`
Throws:
  `SQLException`

#### getXAResource

    public XAResource getXAResource()

Specified by:
  `getXAResource` in interface `XAConnection`

#### start

    public void start(Xid xid,
                      int flags)
               throws 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 `XAResource`
Throws:
  `XAException`

#### end

    public void end(Xid xid,
                    int flags)
             throws 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 `XAResource`
Throws:
  `XAException`

#### prepare

    public int prepare(Xid xid)
                throws 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 `XAResource`
Throws:
  `XAException`

#### recover

    public Xid[] recover(int flag)
                  throws 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 `XAResource`
Throws:
  `XAException`

#### rollback

    public void rollback(Xid xid)
                  throws 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 `XAResource`
Throws:
  `XAException`

#### commit

    public void commit(Xid xid,
                       boolean onePhase)
                throws XAException

Specified by:
  `commit` in interface `XAResource`
Throws:
  `XAException`

#### isSameRM

    public boolean isSameRM(XAResource xares)
                     throws XAException

Specified by:
  `isSameRM` in interface `XAResource`
Throws:
  `XAException`

#### forget

    public void forget(Xid xid)
                throws XAException

Does nothing, since we don't do heuristics.

Specified by:
  `forget` in interface `XAResource`
Throws:
  `XAException`

#### getTransactionTimeout

    public int getTransactionTimeout()

We don't do transaction timeouts. Just returns 0.

Specified by:
  `getTransactionTimeout` in interface `XAResource`

#### setTransactionTimeout

    public boolean setTransactionTimeout(int seconds)

We don't do transaction timeouts. Returns false.

Specified by:
  `setTransactionTimeout` in interface `XAResource`