diff --git a/src/main/java/org/springframework/data/r2dbc/dialect/AnonymousBindMarkers.java b/src/main/java/org/springframework/data/r2dbc/dialect/AnonymousBindMarkers.java index 32b4cc1..c144245 100644 --- a/src/main/java/org/springframework/data/r2dbc/dialect/AnonymousBindMarkers.java +++ b/src/main/java/org/springframework/data/r2dbc/dialect/AnonymousBindMarkers.java @@ -21,6 +21,12 @@ import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; * Anonymous, index-based bind marker using a static placeholder. Instances are bound by the ordinal position ordered by * the appearance of the placeholder. This implementation creates indexed bind markers using an anonymous placeholder * that correlates with an index. + *

+ * Note: Anonymous bind markers are problematic because the have to appear in generated SQL in the same order they get generated. + * + * This might cause challenges in the future with complex generate statements. + * For example those containing subselects which limit the freedom of arranging bind markers. + *

* * @author Mark Paluch */ diff --git a/src/test/java/org/springframework/data/r2dbc/function/AbstractTransactionalDatabaseClientIntegrationTests.java b/src/test/java/org/springframework/data/r2dbc/function/AbstractTransactionalDatabaseClientIntegrationTests.java index 628020f..deecc2e 100644 --- a/src/test/java/org/springframework/data/r2dbc/function/AbstractTransactionalDatabaseClientIntegrationTests.java +++ b/src/test/java/org/springframework/data/r2dbc/function/AbstractTransactionalDatabaseClientIntegrationTests.java @@ -209,13 +209,19 @@ public abstract class AbstractTransactionalDatabaseClientIntegrationTests extend Flux transactionIds = databaseClient.inTransaction(db -> { + // We have to execute a sql statement first. + // Otherwise some databases (MySql) don't have a transaction id. Mono insert = db.execute().sql(getInsertIntoLegosetStatement()) // .bind(0, 42055) // .bind(1, "SCHAUFELRADBAGGER") // .bindNull(2, Integer.class) // .fetch().rowsUpdated(); - Flux txId = db.execute().sql(getCurrentTransactionIdStatement()).map((r, md) -> r.get(0)).all(); + Flux txId = db.execute() // + .sql(getCurrentTransactionIdStatement()) // + .map((row, md) -> row.get(0)) // + .all(); + return insert.thenMany(txId.concatWith(txId)); }); @@ -223,7 +229,7 @@ public abstract class AbstractTransactionalDatabaseClientIntegrationTests extend .consumeNextWith(actual -> { assertThat(actual).hasSize(2); - assertThat(actual).containsExactly(actual.get(1), actual.get(0)); + assertThat(actual.get(0)).isEqualTo(actual.get(1)); }) // .verifyComplete(); }