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 + -
显示快捷键?