Skip to content

Commit aa806c4

Browse files
Copilotasmyasnikov
andcommitted
Implement QuerySnapshotReadWrite transaction mode for query client
Co-authored-by: asmyasnikov <[email protected]>
1 parent edbdaaa commit aa806c4

File tree

10 files changed

+38
-8
lines changed

10 files changed

+38
-8
lines changed

tests/aio/query/test_query_session_pool.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ async def callee(session: QuerySession):
6969
(None),
7070
(ydb.QuerySerializableReadWrite()),
7171
(ydb.QuerySnapshotReadOnly()),
72+
(ydb.QuerySnapshotReadWrite()),
7273
(ydb.QueryOnlineReadOnly()),
7374
(ydb.QueryStaleReadOnly()),
7475
],

tests/query/test_query_session_pool.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ def callee(session: QuerySession):
6868
(None),
6969
(ydb.QuerySerializableReadWrite()),
7070
(ydb.QuerySnapshotReadOnly()),
71+
(ydb.QuerySnapshotReadWrite()),
7172
(ydb.QueryOnlineReadOnly()),
7273
(ydb.QueryStaleReadOnly()),
7374
],

ydb/_grpc/grpcwrapper/ydb_query.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ def to_proto(self) -> ydb_query_pb2.TransactionSettings:
7979
return ydb_query_pb2.TransactionSettings(online_read_only=self.tx_mode.to_proto())
8080
if self.tx_mode.name == "stale_read_only":
8181
return ydb_query_pb2.TransactionSettings(stale_read_only=self.tx_mode.to_proto())
82+
if self.tx_mode.name == "snapshot_read_write":
83+
return ydb_query_pb2.TransactionSettings(snapshot_read_write=self.tx_mode.to_proto())
8284

8385

8486
@dataclass

ydb/_grpc/grpcwrapper/ydb_query_public_types.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,21 @@ def name(self):
9393

9494
def to_proto(self) -> ydb_query_pb2.StaleModeSettings:
9595
return ydb_query_pb2.StaleModeSettings()
96+
97+
98+
class QuerySnapshotReadWrite(BaseQueryTxMode):
99+
"""Snapshot isolation mode with read-write support.
100+
All read operations within a transaction access the database snapshot.
101+
The snapshot is taken when the transaction begins.
102+
Write operations are also allowed in this mode.
103+
"""
104+
105+
def __init__(self):
106+
self._name = "snapshot_read_write"
107+
108+
@property
109+
def name(self) -> str:
110+
return self._name
111+
112+
def to_proto(self) -> ydb_query_pb2.SnapshotRWModeSettings:
113+
return ydb_query_pb2.SnapshotRWModeSettings()

ydb/aio/query/pool.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,8 @@ async def retry_tx_async(
149149
1) QuerySerializableReadWrite() which is default mode;
150150
2) QueryOnlineReadOnly(allow_inconsistent_reads=False);
151151
3) QuerySnapshotReadOnly();
152-
4) QueryStaleReadOnly().
152+
4) QuerySnapshotReadWrite();
153+
5) QueryStaleReadOnly().
153154
:param retry_settings: RetrySettings object.
154155
155156
:return: Result sets or exception in case of execution errors.
@@ -161,7 +162,7 @@ async def retry_tx_async(
161162
async def wrapped_callee():
162163
async with self.checkout() as session:
163164
async with session.transaction(tx_mode=tx_mode) as tx:
164-
if tx_mode.name in ["serializable_read_write", "snapshot_read_only"]:
165+
if tx_mode.name in ["serializable_read_write", "snapshot_read_only", "snapshot_read_write"]:
165166
await tx.begin()
166167
result = await callee(tx, *args, **kwargs)
167168
await tx.commit()

ydb/aio/query/transaction.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ def __init__(self, driver, session_state, session, tx_mode):
3333
1) QuerySerializableReadWrite() which is default mode;
3434
2) QueryOnlineReadOnly(allow_inconsistent_reads=False);
3535
3) QuerySnapshotReadOnly();
36-
4) QueryStaleReadOnly().
36+
4) QuerySnapshotReadWrite();
37+
5) QueryStaleReadOnly().
3738
"""
3839
super().__init__(driver, session_state, session, tx_mode)
3940
self._init_callback_handler(base.CallbackHandlerMode.ASYNC)

ydb/query/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"QueryOnlineReadOnly",
55
"QuerySerializableReadWrite",
66
"QuerySnapshotReadOnly",
7+
"QuerySnapshotReadWrite",
78
"QueryStaleReadOnly",
89
"QuerySessionPool",
910
"QueryClientSettings",
@@ -29,6 +30,7 @@
2930
QueryOnlineReadOnly,
3031
QuerySerializableReadWrite,
3132
QuerySnapshotReadOnly,
33+
QuerySnapshotReadWrite,
3234
QueryStaleReadOnly,
3335
)
3436

ydb/query/pool.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,8 @@ def retry_tx_sync(
197197
1) QuerySerializableReadWrite() which is default mode;
198198
2) QueryOnlineReadOnly(allow_inconsistent_reads=False);
199199
3) QuerySnapshotReadOnly();
200-
4) QueryStaleReadOnly().
200+
4) QuerySnapshotReadWrite();
201+
5) QueryStaleReadOnly().
201202
:param retry_settings: RetrySettings object.
202203
203204
:return: Result sets or exception in case of execution errors.
@@ -212,7 +213,7 @@ def retry_tx_sync(
212213
def wrapped_callee():
213214
with self.checkout(timeout=retry_settings.max_session_acquire_timeout) as session:
214215
with session.transaction(tx_mode=tx_mode) as tx:
215-
if tx_mode.name in ["serializable_read_write", "snapshot_read_only"]:
216+
if tx_mode.name in ["serializable_read_write", "snapshot_read_only", "snapshot_read_write"]:
216217
tx.begin()
217218
result = callee(tx, *args, **kwargs)
218219
tx.commit()

ydb/query/session.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,8 @@ def transaction(self, tx_mode: Optional[base.BaseQueryTxMode] = None) -> QueryTx
310310
1) QuerySerializableReadWrite() which is default mode;
311311
2) QueryOnlineReadOnly(allow_inconsistent_reads=False);
312312
3) QuerySnapshotReadOnly();
313-
4) QueryStaleReadOnly().
313+
4) QuerySnapshotReadWrite();
314+
5) QueryStaleReadOnly().
314315
315316
:return transaction context manager.
316317

ydb/query/transaction.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,8 @@ def __init__(self, driver, session_state, session, tx_mode):
201201
1) QuerySerializableReadWrite() which is default mode;
202202
2) QueryOnlineReadOnly(allow_inconsistent_reads=False);
203203
3) QuerySnapshotReadOnly();
204-
4) QueryStaleReadOnly().
204+
4) QuerySnapshotReadWrite();
205+
5) QueryStaleReadOnly().
205206
"""
206207

207208
self._driver = driver
@@ -351,7 +352,8 @@ def __init__(self, driver, session_state, session, tx_mode):
351352
1) QuerySerializableReadWrite() which is default mode;
352353
2) QueryOnlineReadOnly(allow_inconsistent_reads=False);
353354
3) QuerySnapshotReadOnly();
354-
4) QueryStaleReadOnly().
355+
4) QuerySnapshotReadWrite();
356+
5) QueryStaleReadOnly().
355357
"""
356358

357359
super().__init__(driver, session_state, session, tx_mode)

0 commit comments

Comments
 (0)