Skip to content

Commit 320bd12

Browse files
authored
Merge pull request #88 from ydb-platform/snapshot-ro-tx
add support for snapshot_read_only transactions
2 parents f5dfee5 + cc7e85c commit 320bd12

File tree

3 files changed

+62
-0
lines changed

3 files changed

+62
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
* Fixed error message while get token from metadata with asyncio iam
2+
* Add `SnapshotReadOnly` transaction mode support to `session.transaction`
23

34
## 2.11.1 ##
45
* Regenerate protobuf code from public api protos (some private protobufs was removed)

tests/aio/test_tx.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import pytest
2+
from contextlib import suppress
3+
24
import ydb.aio.iam
35

46

@@ -49,3 +51,46 @@ async def test_credentials():
4951
raised = True
5052

5153
assert raised
54+
55+
56+
@pytest.mark.asyncio
57+
async def test_tx_snapshot_ro(driver, database):
58+
session = await driver.table_client.session().create()
59+
description = (
60+
ydb.TableDescription()
61+
.with_primary_keys("key")
62+
.with_columns(
63+
ydb.Column("key", ydb.OptionalType(ydb.PrimitiveType.Uint64)),
64+
ydb.Column("value", ydb.OptionalType(ydb.PrimitiveType.Uint64)),
65+
)
66+
)
67+
tb_name = f"{database}/test"
68+
with suppress(ydb.issues.SchemeError):
69+
await session.drop_table(tb_name)
70+
await session.create_table(tb_name, description)
71+
await session.transaction(ydb.SerializableReadWrite()).execute(
72+
"""INSERT INTO `test` (`key`, `value`) VALUES (1, 1), (2, 2)""",
73+
commit_tx=True,
74+
)
75+
76+
ro_tx = session.transaction(tx_mode=ydb.SnapshotReadOnly())
77+
data1 = await ro_tx.execute("SELECT value FROM `test` WHERE key = 1")
78+
79+
await session.transaction(ydb.SerializableReadWrite()).execute(
80+
"UPDATE `test` SET value = value + 1", commit_tx=True
81+
)
82+
83+
data2 = await ro_tx.execute("SELECT value FROM `test` WHERE key = 1")
84+
assert data1[0].rows == data2[0].rows == [{"value": 1}]
85+
86+
await ro_tx.commit()
87+
88+
with pytest.raises(ydb.issues.GenericError) as exc_info:
89+
await ro_tx.execute("UPDATE `test` SET value = value + 1")
90+
assert "read only transaction" in exc_info.value.message
91+
92+
data = await session.transaction(tx_mode=ydb.SnapshotReadOnly()).execute(
93+
"SELECT value FROM `test` WHERE key = 1",
94+
commit_tx=True,
95+
)
96+
assert data[0].rows == [{"value": 2}]

ydb/table.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -780,6 +780,22 @@ def settings(self):
780780
pass
781781

782782

783+
class SnapshotReadOnly(AbstractTransactionModeBuilder):
784+
__slots__ = ("_pb", "_name")
785+
786+
def __init__(self):
787+
self._pb = _apis.ydb_table.SnapshotModeSettings()
788+
self._name = "snapshot_read_only"
789+
790+
@property
791+
def settings(self):
792+
return self._pb
793+
794+
@property
795+
def name(self):
796+
return self._name
797+
798+
783799
class SerializableReadWrite(AbstractTransactionModeBuilder):
784800
__slots__ = ("_pb", "_name")
785801

0 commit comments

Comments
 (0)