From 698c499863aee62648b6b5e7784ddfd3bcc881e4 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 12 Aug 2014 11:50:43 +0200 Subject: [PATCH] [#3537] Incorrect call to releaseSavepoint() --- .../jooq/impl/DefaultTransactionProvider.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultTransactionProvider.java b/jOOQ/src/main/java/org/jooq/impl/DefaultTransactionProvider.java index ab3c88c5c9..0ab510b1df 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultTransactionProvider.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultTransactionProvider.java @@ -52,6 +52,7 @@ import org.jooq.Configuration; import org.jooq.ConnectionProvider; import org.jooq.TransactionContext; import org.jooq.TransactionProvider; +import org.jooq.exception.DataAccessException; /** * A default implementation for the {@link TransactionProvider} SPI. @@ -126,7 +127,13 @@ public class DefaultTransactionProvider implements TransactionProvider { // [#3489] Explicitly release savepoints prior to commit if (savepoint != null) - connection(ctx.configuration()).releaseSavepoint(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()) { @@ -142,10 +149,17 @@ public class DefaultTransactionProvider implements TransactionProvider { @Override public final void rollback(TransactionContext ctx) { Stack savepoints = savepoints(ctx.configuration()); - Savepoint savepoint = savepoints.pop(); + Savepoint savepoint = null; + + // [#3537] If something went wrong with the savepoints per se + if (!savepoints.isEmpty()) + savepoint = savepoints.pop(); try { - connection(ctx.configuration()).rollback(savepoint); + if (savepoint == null) + connection(ctx.configuration()).rollback(); + else + connection(ctx.configuration()).rollback(savepoint); } finally {