use of org.datanucleus.transaction.RollbackException in project datanucleus-core by datanucleus.
the class TransactionImpl method commit.
/**
* Method to commit the transaction.
*/
public void commit() {
if (!isActive()) {
throw new TransactionNotActiveException();
}
// the exception and call rollback themselves. i.e we don't need to close the DB connection or set "active" to false.
if (rollbackOnly) {
// Throw an exception since can only exit via rollback
if (NucleusLogger.TRANSACTION.isDebugEnabled()) {
NucleusLogger.TRANSACTION.debug(Localiser.msg("015020"));
}
throw new NucleusDataStoreException(Localiser.msg("015020")).setFatal();
}
long startTime = System.currentTimeMillis();
boolean success = false;
// whether the transaction can be completed
boolean canComplete = true;
List<Throwable> errors = new ArrayList();
try {
// TODO Is this needed? om.preCommit will handle flush calls
flush();
internalPreCommit();
internalCommit();
success = true;
} catch (RollbackException e) {
// in Transaction.Synchronization and they should cascade up to user code
if (NucleusLogger.TRANSACTION.isDebugEnabled()) {
NucleusLogger.TRANSACTION.debug(StringUtils.getStringFromStackTrace(e));
}
errors.add(e);
} catch (HeuristicRollbackException e) {
// in Transaction.Synchronization and they should cascade up to user code
if (NucleusLogger.TRANSACTION.isDebugEnabled()) {
NucleusLogger.TRANSACTION.debug(StringUtils.getStringFromStackTrace(e));
}
errors.add(e);
} catch (HeuristicMixedException e) {
// in Transaction.Synchronization and they should cascade up to user code
if (NucleusLogger.TRANSACTION.isDebugEnabled()) {
NucleusLogger.TRANSACTION.debug(StringUtils.getStringFromStackTrace(e));
}
errors.add(e);
} catch (NucleusUserException e) {
// they must be cascade up to user code and transaction is still alive
if (NucleusLogger.TRANSACTION.isDebugEnabled()) {
NucleusLogger.TRANSACTION.debug(StringUtils.getStringFromStackTrace(e));
}
canComplete = false;
throw e;
} catch (NucleusException e) {
// in Transaction.Synchronization and they should cascade up to user code
if (NucleusLogger.TRANSACTION.isDebugEnabled()) {
NucleusLogger.TRANSACTION.debug(StringUtils.getStringFromStackTrace(e));
}
errors.add(e);
} finally {
if (canComplete) {
try {
if (!success) {
rollback();
} else {
internalPostCommit();
}
} catch (Throwable e) {
errors.add(e);
}
}
}
if (!errors.isEmpty()) {
throw new NucleusTransactionException(Localiser.msg("015007"), errors.toArray(new Throwable[errors.size()]));
}
if (NucleusLogger.TRANSACTION.isDebugEnabled()) {
NucleusLogger.TRANSACTION.debug(Localiser.msg("015022", System.currentTimeMillis() - startTime));
}
}
Aggregations