From aa733032cc99794e776553f61f8ed687e1d035fc Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 4 Jan 2023 12:48:51 +0100 Subject: [PATCH] [jOOQ/jOOQ#7106] More transaction statement support (WIP) This includes: - Update autoCommit in Firebird, HSQLDB, Oracle on StartTransaction - Execute no-op in Oracle, Firebird on StartTransaction --- .../java/org/jooq/impl/AbstractQuery.java | 25 +++++++++++++------ .../java/org/jooq/impl/StartTransaction.java | 11 +++----- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractQuery.java index 822f05b0a4..ef826f01b0 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractQuery.java @@ -42,6 +42,9 @@ import static java.lang.Boolean.TRUE; import static org.jooq.Constants.FULL_VERSION; import static org.jooq.ExecuteType.DDL; // ... +import static org.jooq.SQLDialect.FIREBIRD; +import static org.jooq.SQLDialect.HSQLDB; +// ... // ... // ... // ... @@ -60,6 +63,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; +import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.concurrent.Executor; @@ -69,9 +73,9 @@ import org.jooq.Configuration; import org.jooq.ExecuteContext; import org.jooq.ExecuteListener; import org.jooq.Param; -import org.jooq.Query; import org.jooq.Record; import org.jooq.RenderContext; +import org.jooq.SQLDialect; import org.jooq.Select; import org.jooq.conf.QueryPoolable; import org.jooq.conf.SettingsTools; @@ -87,14 +91,15 @@ import org.jooq.tools.JooqLogger; */ abstract class AbstractQuery extends AbstractAttachableQueryPart implements CloseableQuery { - private static final JooqLogger log = JooqLogger.getLogger(AbstractQuery.class); + private static final JooqLogger log = JooqLogger.getLogger(AbstractQuery.class); + private static final Set SET_AUTOCOMMIT_ON_START_TRANSACTION = SQLDialect.supportedBy(FIREBIRD, HSQLDB); - private int timeout; - private QueryPoolable poolable = QueryPoolable.DEFAULT; - private boolean keepStatement; - transient PreparedStatement statement; - transient int statementExecutionCount; - transient Rendered rendered; + private int timeout; + private QueryPoolable poolable = QueryPoolable.DEFAULT; + private boolean keepStatement; + transient PreparedStatement statement; + transient int statementExecutionCount; + transient Rendered rendered; AbstractQuery(Configuration configuration) { super(configuration); @@ -306,6 +311,10 @@ abstract class AbstractQuery extends AbstractAttachableQueryPa + "results of a jOOQ query. Simply embed your query in the stream, e.g. using Flux.from(query). " + "See also: https://www.jooq.org/doc/latest/manual/sql-execution/fetching/reactive-fetching/"); + // [#7106] In some SQL dialects, starting a transaction requires JDBC interaction + if (this instanceof StartTransaction && SET_AUTOCOMMIT_ON_START_TRANSACTION.contains(ctx.dialect())) + ctx.connection().setAutoCommit(false); + listener.prepareStart(ctx); prepare(ctx); listener.prepareEnd(ctx); diff --git a/jOOQ/src/main/java/org/jooq/impl/StartTransaction.java b/jOOQ/src/main/java/org/jooq/impl/StartTransaction.java index cced810d52..76c7ec1637 100644 --- a/jOOQ/src/main/java/org/jooq/impl/StartTransaction.java +++ b/jOOQ/src/main/java/org/jooq/impl/StartTransaction.java @@ -95,15 +95,10 @@ implements - - - - - - - case FIREBIRD: { - ctx.visit(K_SET).sql(' ').visit(K_TRANSACTION).sql(' ').visit(K_READ).sql(' ').visit(K_WRITE); + // [#7106] Blocks can't start new transactions + if (ctx.data(DATA_BLOCK_NESTING) == null) + ctx.visit(begin()); break; }