|
1 | 1 | import pytest
|
| 2 | +from contextlib import suppress |
| 3 | + |
2 | 4 | import ydb.aio.iam
|
3 | 5 |
|
4 | 6 |
|
@@ -49,3 +51,46 @@ async def test_credentials():
|
49 | 51 | raised = True
|
50 | 52 |
|
51 | 53 | 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}] |
0 commit comments