From e4cfe15341ab5b1d229aa260b57b2139b6758ead Mon Sep 17 00:00:00 2001 From: Alexandr Gorshenin Date: Fri, 17 Jul 2026 17:24:29 +0100 Subject: [PATCH 1/3] Update proto-api version --- bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bom/pom.xml b/bom/pom.xml index 034495889..187680e60 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -15,7 +15,7 @@ 1.0.0 - 1.9.4 + 1.9.5 2.3.1 From b6473a081fab1721e46de3040b1cb3638cc41372 Mon Sep 17 00:00:00 2001 From: Alexandr Gorshenin Date: Fri, 17 Jul 2026 17:30:10 +0100 Subject: [PATCH 2/3] Added new TxMode READ_COMMITTED_RW --- .../src/main/java/tech/ydb/common/transaction/TxMode.java | 3 ++- .../src/main/java/tech/ydb/query/impl/TableClientImpl.java | 3 +++ query/src/main/java/tech/ydb/query/impl/TxControl.java | 6 ++++++ table/src/main/java/tech/ydb/table/impl/TxControlToPb.java | 6 ++++++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/tech/ydb/common/transaction/TxMode.java b/common/src/main/java/tech/ydb/common/transaction/TxMode.java index 455b4ae95..d936fce60 100644 --- a/common/src/main/java/tech/ydb/common/transaction/TxMode.java +++ b/common/src/main/java/tech/ydb/common/transaction/TxMode.java @@ -10,8 +10,9 @@ public enum TxMode { SERIALIZABLE_RW, SNAPSHOT_RO, SNAPSHOT_RW, - STALE_RO, + READ_COMMITTED_RW, + STALE_RO, ONLINE_RO, ONLINE_INCONSISTENT_RO } diff --git a/query/src/main/java/tech/ydb/query/impl/TableClientImpl.java b/query/src/main/java/tech/ydb/query/impl/TableClientImpl.java index ff00becc9..27ec97e6f 100644 --- a/query/src/main/java/tech/ydb/query/impl/TableClientImpl.java +++ b/query/src/main/java/tech/ydb/query/impl/TableClientImpl.java @@ -95,6 +95,9 @@ private YdbQuery.TransactionControl mapTxControl(YdbTable.TransactionControl tc) if (tc.getBeginTx().hasSnapshotReadWrite()) { return TxControl.txModeCtrl(TxMode.SNAPSHOT_RW, tc.getCommitTx()); } + if (tc.getBeginTx().hasReadCommittedReadWrite()) { + return TxControl.txModeCtrl(TxMode.READ_COMMITTED_RW, tc.getCommitTx()); + } if (tc.getBeginTx().hasStaleReadOnly()) { return TxControl.txModeCtrl(TxMode.STALE_RO, tc.getCommitTx()); } diff --git a/query/src/main/java/tech/ydb/query/impl/TxControl.java b/query/src/main/java/tech/ydb/query/impl/TxControl.java index f4c8e772f..91e518cd6 100644 --- a/query/src/main/java/tech/ydb/query/impl/TxControl.java +++ b/query/src/main/java/tech/ydb/query/impl/TxControl.java @@ -20,6 +20,10 @@ class TxControl { .setSnapshotReadWrite(YdbQuery.SnapshotRWModeSettings.getDefaultInstance()) .build(); + private static final YdbQuery.TransactionSettings TS_READ_COMMITTED_RW = YdbQuery.TransactionSettings.newBuilder() + .setReadCommittedReadWrite(YdbQuery.ReadCommittedRWModeSettings.getDefaultInstance()) + .build(); + private static final YdbQuery.TransactionSettings TS_STALE = YdbQuery.TransactionSettings.newBuilder() .setStaleReadOnly(YdbQuery.StaleModeSettings.getDefaultInstance()) .build(); @@ -61,6 +65,8 @@ public static YdbQuery.TransactionSettings txSettings(TxMode tx) { return TS_SNAPSHOT; case SNAPSHOT_RW: return TS_SNAPSHOT_RW; + case READ_COMMITTED_RW: + return TS_READ_COMMITTED_RW; case STALE_RO: return TS_STALE; case ONLINE_RO: diff --git a/table/src/main/java/tech/ydb/table/impl/TxControlToPb.java b/table/src/main/java/tech/ydb/table/impl/TxControlToPb.java index 175eef27c..35e38b366 100644 --- a/table/src/main/java/tech/ydb/table/impl/TxControlToPb.java +++ b/table/src/main/java/tech/ydb/table/impl/TxControlToPb.java @@ -20,6 +20,10 @@ public class TxControlToPb { .setSnapshotReadWrite(YdbTable.SnapshotRWModeSettings.getDefaultInstance()) .build(); + private static final YdbTable.TransactionSettings TS_READ_COMMITTED_RW = YdbTable.TransactionSettings.newBuilder() + .setReadCommittedReadWrite(YdbTable.ReadCommittedRWModeSettings.getDefaultInstance()) + .build(); + private static final YdbTable.TransactionSettings TS_STALE = YdbTable.TransactionSettings.newBuilder() .setStaleReadOnly(YdbTable.StaleModeSettings.getDefaultInstance()) .build(); @@ -61,6 +65,8 @@ public static YdbTable.TransactionSettings txSettings(TxMode tx) { return TS_SNAPSHOT_RO; case SNAPSHOT_RW: return TS_SNAPSHOT_RW; + case READ_COMMITTED_RW: + return TS_READ_COMMITTED_RW; case STALE_RO: return TS_STALE; case ONLINE_RO: From a1a581adc1706bc9387f8019b802ff7872a8ea39 Mon Sep 17 00:00:00 2001 From: Alexandr Gorshenin Date: Fri, 17 Jul 2026 17:46:35 +0100 Subject: [PATCH 3/3] Added base test for ReadCommitted tx level --- .../ydb/query/impl/QueryIntegrationTest.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/query/src/test/java/tech/ydb/query/impl/QueryIntegrationTest.java b/query/src/test/java/tech/ydb/query/impl/QueryIntegrationTest.java index c38b5c8ca..f45a22ac1 100644 --- a/query/src/test/java/tech/ydb/query/impl/QueryIntegrationTest.java +++ b/query/src/test/java/tech/ydb/query/impl/QueryIntegrationTest.java @@ -626,4 +626,49 @@ public void testNoTxStatement() { } } } + + @Test + @Ignore // disable while READ_COMMITTED is not supported + public void testReadCommittedStatement() { + String selectQuery = "SELECT * FROM `" + TEST_TABLE + "` ORDR BY id"; + String insertQuery = "DECLARE $id AS Int32; DECLARE $name AS Text; " + + "INSERT INTO `" + TEST_TABLE + "` (id, name) VALUES ($id, $name)"; + try (QueryClient client = QueryClient.newClient(ydbTransport).build()) { + QuerySession session1 = client.createSession(Duration.ofSeconds(5)).join().getValue(); + QuerySession session2 = client.createSession(Duration.ofSeconds(5)).join().getValue(); + + try { + QueryTransaction tx1 = session1.createNewTransaction(TxMode.READ_COMMITTED_RW); + QueryTransaction tx2 = session2.createNewTransaction(TxMode.READ_COMMITTED_RW); + + Result s1 = QueryReader.readFrom(tx1.createQuery(selectQuery)).join(); + Result s2 = QueryReader.readFrom(tx2.createQuery(selectQuery)).join(); + + Assert.assertTrue("Cannot read with " + s1, s1.isSuccess()); + Assert.assertTrue("Cannot read with " + s1, s2.isSuccess()); + + Params prms1 = Params.of("$id", PrimitiveValue.newInt32(1), "$name", PrimitiveValue.newText("value1")); + Params prms2 = Params.of("$id", PrimitiveValue.newInt32(2), "$name", PrimitiveValue.newText("value2")); + + Result i1 = tx1.createQuery(insertQuery, prms1).execute().join(); + Result i2 = tx2.createQuery(insertQuery, prms2).execute().join(); + + Assert.assertTrue("Cannot insert with " + i1, i1.isSuccess()); + Assert.assertTrue("Cannot insert with " + i2, i2.isSuccess()); + + Result c1 = tx1.commit().join(); + Result c2 = tx2.commit().join(); + + Assert.assertTrue("Cannot commit with " + c1, c1.isSuccess()); + Assert.assertTrue("Cannot commit with " + c2, c2.isSuccess()); + } finally { + session1.close(); + session2.close(); + try (QuerySession session = client.createSession(SESSION_TIMEOUT).join().getValue()) { + session.createQuery("DELETE FROM " + TEST_TABLE, TxMode.SERIALIZABLE_RW).execute() + .join().getStatus().expectSuccess(); + } + } + } + } }