/** starts work on a transaction branch */ public void start(Xid xid, int flags) throws XAException { if (_xid != null) { if (log.isLoggable(Level.FINER)) log.finer("connection pool start XA: rejoin " + this); return; } if (flags == TMJOIN && _xid == null) { // TMJOIN means the resource manager is managing more than one // connection. The delegates tie the PoolItems managed by // the same resource manager together. _xid = xid; UserTransactionImpl trans = _cm.getTransaction(); if (trans != null) { ManagedPoolItem xaHead = trans.findJoin(this); if (xaHead != null) { _xaNext = xaHead._xaNext; _xaHead = xaHead; xaHead._xaNext = this; } } } // local transaction optimization if (!_isXATransaction && flags != TMJOIN && _localTransaction != null) { try { if (log.isLoggable(Level.FINER)) log.finer("begin-local-XA: " + xid + " " + _localTransaction); _localTransaction.begin(); } catch (ResourceException e) { throw new XAExceptionWrapper(e); } _xid = xid; return; } if (_xaResource != null) { if (log.isLoggable(Level.FINER)) log.finer("start-XA: " + xid + " " + _xaResource); _xaResource.start(xid, flags); _isXATransaction = true; } else { if (log.isLoggable(Level.FINER)) log.finer("start-XA with non XA resource: " + xid + " " + _xaResource); } _xid = xid; }