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
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/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();
+ }
+ }
+ }
+ }
}
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: