📄 transactionutil.java
字号:
int status = ut.getStatus();
Debug.logVerbose("[TransactionUtil.rollback] current status : " + getTransactionStateString(status), module);
if (status != STATUS_NO_TRANSACTION) {
//if (Debug.infoOn()) Thread.dumpStack();
if (Debug.infoOn()) {
Exception newE = new Exception("Stack Trace");
Debug.logError(newE, "[TransactionUtil.rollback]", module);
}
ut.rollback();
Debug.logInfo("[TransactionUtil.rollback] transaction rolled back", module);
// clear out the stamps to keep it clean
clearTransactionStamps();
} else {
Debug.logInfo("[TransactionUtil.rollback] transaction not rolled back, status is STATUS_NO_TRANSACTION", module);
}
} catch (SystemException e) {
//This is Java 1.4 only, but useful for certain debuggins: Throwable t = e.getCause() == null ? e : e.getCause();
throw new GenericTransactionException("System error, could not roll back transaction", e);
}
} else {
Debug.logInfo("[TransactionUtil.rollback] No UserTransaction, transaction not rolled back", module);
}
}
/** Makes a roll back the only possible outcome of the transaction in the current thread IF transactions are available */
public static void setRollbackOnly() throws GenericTransactionException {
UserTransaction ut = TransactionFactory.getUserTransaction();
if (ut != null) {
try {
int status = ut.getStatus();
Debug.logVerbose("[TransactionUtil.setRollbackOnly] current code : " + getTransactionStateString(status), module);
if (status != STATUS_NO_TRANSACTION) {
if (Debug.infoOn()) Thread.dumpStack();
ut.setRollbackOnly();
Debug.logInfo("[TransactionUtil.setRollbackOnly] transaction roll back only set", module);
} else {
Debug.logInfo("[TransactionUtil.setRollbackOnly] transaction roll back only not set, status is STATUS_NO_TRANSACTION", module);
}
} catch (SystemException e) {
//This is Java 1.4 only, but useful for certain debuggins: Throwable t = e.getCause() == null ? e : e.getCause();
throw new GenericTransactionException("System error, could not set roll back only on transaction", e);
}
} else {
Debug.logInfo("[TransactionUtil.setRollbackOnly] No UserTransaction, transaction roll back only not set", module);
}
}
/** Sets the timeout of the transaction in the current thread IF transactions are available */
public static void setTransactionTimeout(int seconds) throws GenericTransactionException {
UserTransaction ut = TransactionFactory.getUserTransaction();
if (ut != null) {
try {
ut.setTransactionTimeout(seconds);
} catch (SystemException e) {
throw new GenericTransactionException("System error, could not set transaction timeout", e);
}
}
}
/** Enlists the given XAConnection and if a transaction is active in the current thread, returns a plain JDBC Connection */
public static Connection enlistConnection(XAConnection xacon) throws GenericTransactionException {
if (xacon == null) {
return null;
}
try {
XAResource resource = xacon.getXAResource();
TransactionUtil.enlistResource(resource);
return xacon.getConnection();
} catch (SQLException e) {
throw new GenericTransactionException("SQL error, could not enlist connection in transaction even though transactions are available", e);
}
}
public static void enlistResource(XAResource resource) throws GenericTransactionException {
if (resource == null) {
return;
}
try {
TransactionManager tm = TransactionFactory.getTransactionManager();
if (tm != null && tm.getStatus() == STATUS_ACTIVE) {
Transaction tx = tm.getTransaction();
if (tx != null) {
tx.enlistResource(resource);
}
}
} catch (RollbackException e) {
//This is Java 1.4 only, but useful for certain debuggins: Throwable t = e.getCause() == null ? e : e.getCause();
throw new GenericTransactionException("Roll Back error, could not enlist resource in transaction even though transactions are available, current transaction rolled back", e);
} catch (SystemException e) {
//This is Java 1.4 only, but useful for certain debuggins: Throwable t = e.getCause() == null ? e : e.getCause();
throw new GenericTransactionException("System error, could not enlist resource in transaction even though transactions are available", e);
}
}
public static String getTransactionStateString(int state) {
switch (state) {
case Status.STATUS_ACTIVE:
return "Transaction Active (" + state + ")";
case Status.STATUS_COMMITTED:
return "Transaction Committed (" + state + ")";
case Status.STATUS_COMMITTING:
return "Transaction Committing (" + state + ")";
case Status.STATUS_MARKED_ROLLBACK:
return "Transaction Marked Rollback (" + state + ")";
case Status.STATUS_NO_TRANSACTION:
return "No Transaction (" + state + ")";
case Status.STATUS_PREPARED:
return "Transaction Prepared (" + state + ")";
case Status.STATUS_PREPARING:
return "Transaction Preparing (" + state + ")";
case Status.STATUS_ROLLEDBACK:
return "Transaction Rolledback (" + state + ")";
case Status.STATUS_ROLLING_BACK:
return "Transaction Rolling Back (" + state + ")";
case Status.STATUS_UNKNOWN:
return "Transaction Status Unknown (" + state + ")";
default:
return "Not a valid state code (" + state + ")";
}
}
public static void registerSynchronization(Synchronization sync) throws GenericTransactionException {
if (sync == null) {
return;
}
try {
TransactionManager tm = TransactionFactory.getTransactionManager();
if (tm != null && tm.getStatus() == STATUS_ACTIVE) {
Transaction tx = tm.getTransaction();
if (tx != null) {
tx.registerSynchronization(sync);
}
}
} catch (RollbackException e) {
//This is Java 1.4 only, but useful for certain debuggins: Throwable t = e.getCause() == null ? e : e.getCause();
throw new GenericTransactionException("Roll Back error, could not register synchronization in transaction even though transactions are available, current transaction rolled back", e);
} catch (SystemException e) {
//This is Java 1.4 only, but useful for certain debuggins: Throwable t = e.getCause() == null ? e : e.getCause();
throw new GenericTransactionException("System error, could not register synchronization in transaction even though transactions are available", e);
}
}
private static ThreadLocal transactionStartStamp = new ThreadLocal();
private static ThreadLocal transactionLastNowStamp = new ThreadLocal();
public static Timestamp getTransactionStartStamp() {
Timestamp curStamp = (Timestamp) transactionStartStamp.get();
if (curStamp == null) {
curStamp = UtilDateTime.nowTimestamp();
transactionStartStamp.set(curStamp);
// we know this is the first time set for this transaction, so make sure the StampClearSync is registered
try {
registerSynchronization(new StampClearSync());
} catch (GenericTransactionException e) {
Debug.logError(e, "Error registering StampClearSync synchronization, stamps will still be reset if begin/commit/rollback are call through TransactionUtil, but not if otherwise", module);
}
}
return curStamp;
}
public static Timestamp getTransactionUniqueNowStamp() {
Timestamp lastNowStamp = (Timestamp) transactionLastNowStamp.get();
Timestamp nowTimestamp = UtilDateTime.nowTimestamp();
// check for an overlap with the lastNowStamp, or if the lastNowStamp is in the future because of incrementing to make each stamp unique
if (lastNowStamp != null && (lastNowStamp.equals(nowTimestamp) || lastNowStamp.after(nowTimestamp))) {
nowTimestamp = new Timestamp(lastNowStamp.getTime() + 1);
}
transactionLastNowStamp.set(nowTimestamp);
return nowTimestamp;
}
protected static void clearTransactionStamps() {
transactionStartStamp.set(null);
transactionLastNowStamp.set(null);
}
public static class StampClearSync implements Synchronization {
public void afterCompletion(int status) {
TransactionUtil.clearTransactionStamps();
}
public void beforeCompletion() {
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -