diff --git a/jOOQ/src/main/java/org/jooq/impl/TableRecordImpl.java b/jOOQ/src/main/java/org/jooq/impl/TableRecordImpl.java index 4930c0ea6b..ab17e54f15 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TableRecordImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/TableRecordImpl.java @@ -376,6 +376,16 @@ public class TableRecordImpl> extends AbstractRecord im return result; } + final Object getRecordVersion() { + TableField field = getTable().getRecordVersion(); + return field != null ? get(field) : null; + } + + final Object getRecordTimestamp() { + TableField field = getTable().getRecordTimestamp(); + return field != null ? get(field) : null; + } + final boolean isUpdateRecordVersion() { Configuration configuration = configuration(); diff --git a/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java b/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java index b6e0b399c8..2da6b9f3a9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java @@ -251,9 +251,31 @@ public class UpdatableRecordImpl> extends TableReco } private final int storeMerge0(Field[] storeFields, TableField[] keys) { - InsertQuery merge = create().insertQuery(getTable()); - merge.onDuplicateKeyUpdate(true); - return storeMergeOrUpdate0(storeFields, keys, merge, true); + + // [#10050] No need for MERGE with optimistic locking being active. + if (lockingActive()) { + if (lockValuePresent()) + return storeUpdate0(storeFields, keys); + else + return storeInsert0(storeFields); + } + else { + InsertQuery merge = create().insertQuery(getTable()); + merge.onDuplicateKeyUpdate(true); + return storeMergeOrUpdate0(storeFields, keys, merge, true); + } + } + + private final boolean lockingActive() { + return isExecuteWithOptimisticLocking() && (isTimestampOrVersionAvailable() || isExecuteWithOptimisticLockingIncludeUnversioned()); + } + + private final boolean lockValuePresent() { + + // [#10050] A lock value is present if we either have locking columns or if the record was fetched from the database + return getRecordVersion() != null + || getRecordTimestamp() != null + || getTable().getRecordVersion() == null && getTable().getRecordTimestamp() == null && fetched; } private final & org.jooq.ConditionProvider> int storeMergeOrUpdate0(Field[] storeFields, TableField[] keys, Q query, boolean merge) {