@Override public void begin(TransactionContext ctx) { delegateTransactionProvider.begin(ctx); configurations().push(ctx.configuration()); if (delegateTransactionProvider.nestingLevel(ctx.configuration()) == 1) localTxConnection.set(((DefaultConnectionProvider) ctx.configuration().data(DATA_DEFAULT_TRANSACTION_PROVIDER_CONNECTION)).connection); }
@Override public void commit(TransactionContext ctx) { txMgr.commit(((SpringTransaction) ctx.transaction()).tx); }
@Override public final void begin(TransactionContext ctx) { Deque<Savepoint> savepoints = savepoints(ctx.configuration()); // This is the top-level transaction boolean topLevel = savepoints.isEmpty(); if (topLevel) brace(ctx.configuration(), true); Savepoint savepoint = setSavepoint(ctx.configuration(), topLevel); if (savepoint == UNSUPPORTED_SAVEPOINT && !topLevel) throw new DataAccessException("Cannot nest transactions because Savepoints are not supported"); savepoints.push(savepoint); }
@Override public void rollback(TransactionContext ctx) { txMgr.rollback(((SpringTransaction) ctx.transaction()).tx); }
@Override public void commit(TransactionContext ctx) { if (delegateTransactionProvider.nestingLevel(ctx.configuration()) == 1) localTxConnection.remove(); configurations().pop(); delegateTransactionProvider.commit(ctx); }
@Override public void begin(TransactionContext ctx) { // This TransactionProvider behaves like jOOQ's DefaultTransactionProvider, // which supports nested transactions using Savepoints TransactionStatus tx = txMgr.getTransaction(new DefaultTransactionDefinition(PROPAGATION_NESTED)); ctx.transaction(new SpringTransaction(tx)); }
@Override public void rollback(TransactionContext ctx) { if (delegateTransactionProvider.nestingLevel(ctx.configuration()) == 1) localTxConnection.remove(); configurations().pop(); delegateTransactionProvider.rollback(ctx); }
@Override public final void commit(TransactionContext ctx) { Deque<Savepoint> savepoints = savepoints(ctx.configuration()); Savepoint savepoint = savepoints.pop(); // [#3489] Explicitly release savepoints prior to commit if (savepoint != null && savepoint != UNSUPPORTED_SAVEPOINT && savepoint != IGNORED_SAVEPOINT) try { connection(ctx.configuration()).releaseSavepoint(savepoint); } // [#3537] Ignore those cases where the JDBC driver incompletely implements the API // See also http://stackoverflow.com/q/10667292/521799 catch (DataAccessException ignore) {} // This is the top-level transaction if (savepoints.isEmpty()) { connection(ctx.configuration()).commit(); brace(ctx.configuration(), false); } // Nested commits have no effect else { } }
@Override public final void rollback(TransactionContext ctx) { Deque<Savepoint> savepoints = savepoints(ctx.configuration()); Savepoint savepoint = null; // [#3537] If something went wrong with the savepoints per se if (!savepoints.isEmpty()) savepoint = savepoints.pop(); try { if (savepoint == null || savepoint == UNSUPPORTED_SAVEPOINT) { connection(ctx.configuration()).rollback(); } // [#3955] ROLLBACK is only effective if an exception reaches the // top-level transaction. else if (savepoint == IGNORED_SAVEPOINT) { if (savepoints.isEmpty()) connection(ctx.configuration()).rollback(); } else { connection(ctx.configuration()).rollback(savepoint); } } finally { if (savepoints.isEmpty()) brace(ctx.configuration(), false); } }