transactionimpl.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 1,204 行 · 第 1/3 页
JAVA
1,204 行
{ _status = Status.STATUS_ROLLING_BACK; if (log.isLoggable(Level.FINE)) log.fine(this + " rollback"); for (int i = 0; i < _resourceCount; i++) { XAResource resource = (XAResource) _resources[i]; if ((_resourceState[i] & RES_SHARED_RM) != 0) continue; try { resource.rollback(_resourceXid[i]); if (_timeout > 0) resource.setTransactionTimeout(0); } catch (Throwable e) { log.log(Level.FINE, e.toString(), e); } } _status = Status.STATUS_ROLLEDBACK; } /** * Call all the Synchronization listeners before the commit()/rollback() * starts. */ private void callBeforeCompletion() throws RollbackException { int length = _syncList == null ? 0 : _syncList.size(); for (int i = 0; i < length; i++) { Synchronization sync = _syncList.get(i); try { sync.beforeCompletion(); } catch (RuntimeException e) { setRollbackOnly(e); throw new RollbackException(e); } catch (Throwable e) { log.log(Level.FINE, e.toString(), e); } } // tell the resources everything's done for (int i = _resourceCount - 1; i >= 0; i--) { XAResource resource = _resources[i]; int flag; if (_status == Status.STATUS_MARKED_ROLLBACK) flag = XAResource.TMFAIL; else flag = XAResource.TMSUCCESS; try { if ((_resourceState[i] & RES_ACTIVE) != 0) resource.end(_resourceXid[i], flag); } catch (Throwable e) { log.log(Level.FINE, e.toString(), e); setRollbackOnly(e); } } } /** * Call all the Synchronization listeners after the commit()/rollback() * complete. */ private void callAfterCompletion() { ArrayList<Synchronization> syncList = _syncList; _syncList = null; _userTransaction = null; XidImpl xid = _xid; _xid = null; int status = _status; _status = Status.STATUS_NO_TRANSACTION; _rollbackException = null; // remove the resources which have officially delisted for (int i = _resourceCount - 1; i >= 0; i--) _resources[i] = null; _resourceCount = 0; AbstractXALogStream xaLog = _xaLog; _xaLog = null; if (xaLog != null) { try { xaLog.writeTMFinish(xid); } catch (Throwable e) { log.log(Level.FINER, e.toString(), e); } } int length = syncList == null ? 0 : syncList.size(); for (int i = 0; i < length; i++) { Synchronization sync = (Synchronization) syncList.get(i); try { sync.afterCompletion(status); } catch (Throwable e) { log.log(Level.FINE, e.toString(), e); } } if (_props != null) _props.clear(); } /** * sets the timeout for the transaction */ public void setTransactionTimeout(int seconds) throws SystemException { if (seconds == 0) _timeout = _manager.getTimeout(); else if (seconds < 0) _timeout = MAX_TIMEOUT; else { _timeout = 1000L * (long) seconds; } } /** * sets the timeout for the transaction */ public int getTransactionTimeout() throws SystemException { if (_timeout < 0) return -1; else return (int) (_timeout / 1000L); } public void handleAlarm(Alarm alarm) { try { log.warning(L.l("{0}: timed out after {1} seconds.", this, String.valueOf(getTransactionTimeout()))); setRollbackOnly(); // should not close at this point because there could be following // statements that also need to be rolled back // server/16a7 // close(); } catch (Throwable e) { log.log(Level.FINE, e.toString(), e); } } /** * Close the transaction, rolling back everything and removing all * enlisted resources. */ public void close() { _isDead = true; _alarm.dequeue(); try { if (_status != Status.STATUS_NO_TRANSACTION) rollback(); } catch (Throwable e) { log.log(Level.FINE, e.toString(), e); } if (_syncList != null) _syncList.clear(); for (int i = _resourceCount - 1; i >= 0; i--) _resources[i] = null; _resourceCount = 0; _xid = null; } /** * Printable version of the transaction. */ public String toString() { if (_xid == null) return "Transaction[]"; CharBuffer cb = new CharBuffer(); cb.append("Transaction["); byte []branch = _xid.getBranchQualifier(); addByte(cb, branch[0]); cb.append(":"); byte []global = _xid.getGlobalTransactionId(); for (int i = 24; i < 28; i++) addByte(cb, global[i]); cb.append("]"); return cb.toString(); } /** * Adds hex for debug */ private void addByte(CharBuffer cb, int b) { int h = (b / 16) & 0xf; int l = b & 0xf; if (h >= 10) cb.append((char) ('a' + h - 10)); else cb.append((char) ('0' + h)); if (l >= 10) cb.append((char) ('a' + l - 10)); else cb.append((char) ('0' + l)); } /** * Converts XA error code to a message. */ private static String getXAMessage(XAException xaException) { if (xaException.getMessage() != null && ! xaException.getMessage().equals("")) return xaException.getMessage(); else return (xaName(xaException.errorCode) + ": " + xaMessage(xaException.errorCode)); } /** * Converts XA state code to string. */ private static String xaState(int xaState) { switch (xaState) { case Status.STATUS_ACTIVE: return "ACTIVE"; case Status.STATUS_MARKED_ROLLBACK: return "MARKED-ROLLBACK"; case Status.STATUS_PREPARED: return "PREPARED"; case Status.STATUS_COMMITTED: return "COMITTED"; case Status.STATUS_ROLLEDBACK: return "ROLLEDBACK"; case Status.STATUS_PREPARING: return "PREPARING"; case Status.STATUS_COMMITTING: return "COMMITTING"; case Status.STATUS_ROLLING_BACK: return "ROLLING_BACK"; default: return "XA-STATE(" + xaState + ")"; } } /** * Converts XA error code to string. */ private static String xaName(int xaCode) { switch (xaCode) { // rollback codes case XAException.XA_RBROLLBACK: return "XA_RBROLLBACK"; case XAException.XA_RBCOMMFAIL: return "XA_RBCOMMFAIL"; case XAException.XA_RBDEADLOCK: return "XA_RBDEADLOCK"; case XAException.XA_RBINTEGRITY: return "XA_RBINTEGRITY"; case XAException.XA_RBOTHER: return "XA_RBOTHER"; case XAException.XA_RBPROTO: return "XA_RBPROTO"; case XAException.XA_RBTIMEOUT: return "XA_RBTIMEOUT"; case XAException.XA_RBTRANSIENT: return "XA_RBTRANSIENT"; // suspension code case XAException.XA_NOMIGRATE: return "XA_NOMIGRATE"; // heuristic completion codes case XAException.XA_HEURHAZ: return "XA_HEURHAZ"; case XAException.XA_HEURCOM: return "XA_HEURCOM"; case XAException.XA_HEURRB: return "XA_HEURRB"; case XAException.XA_HEURMIX: return "XA_HEURMIX"; case XAException.XA_RDONLY: return "XA_RDONLY"; // errors case XAException.XAER_RMERR: return "XA_RMERR"; case XAException.XAER_NOTA: return "XA_NOTA"; case XAException.XAER_INVAL: return "XA_INVAL"; case XAException.XAER_PROTO: return "XA_PROTO"; case XAException.XAER_RMFAIL: return "XA_RMFAIL"; case XAException.XAER_DUPID: return "XA_DUPID"; case XAException.XAER_OUTSIDE: return "XA_OUTSIDE"; default: return "XA(" + xaCode + ")"; } } /** * Converts XA error code to a message. */ private static String xaMessage(int xaCode) { switch (xaCode) { // rollback codes case XAException.XA_RBROLLBACK: case XAException.XA_RBOTHER: return L.l("Resource rolled back for an unspecified reason."); case XAException.XA_RBCOMMFAIL: return L.l("Resource rolled back because of a communication failure."); case XAException.XA_RBDEADLOCK: return L.l("Resource rolled back because of a deadlock."); case XAException.XA_RBINTEGRITY: return L.l("Resource rolled back because of an integrity check failure."); case XAException.XA_RBPROTO: return L.l("Resource rolled back because of a protocol error in the resource manager."); case XAException.XA_RBTIMEOUT: return L.l("Resource rolled back because of a timeout."); case XAException.XA_RBTRANSIENT: return L.l("Resource rolled back because of transient error."); // suspension code case XAException.XA_NOMIGRATE: return L.l("Resumption must occur where the suspension occurred."); // heuristic completion codes case XAException.XA_HEURHAZ: return L.l("Resource may have been heuristically completed."); case XAException.XA_HEURCOM: return L.l("Resource has been heuristically committed."); case XAException.XA_HEURRB: return L.l("Resource has been heuristically rolled back."); case XAException.XA_HEURMIX: return L.l("Resource has been heuristically committed and rolled back."); case XAException.XA_RDONLY: return L.l("Resource was read-only and has been heuristically committed."); // errors case XAException.XAER_RMERR: return L.l("Resource manager error."); case XAException.XAER_NOTA: return L.l("The XID (transaction identifier) was invalid."); case XAException.XAER_INVAL: return L.l("Invalid arguments were given."); case XAException.XAER_PROTO: return L.l("Method called in an invalid context."); case XAException.XAER_RMFAIL: return L.l("Resource manager is unavailable."); case XAException.XAER_DUPID: return L.l("Duplicate XID (transaction identifier)."); case XAException.XAER_OUTSIDE: return L.l("Resource manager called outside of transaction."); default: return ""; } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?