Skip to content

Commit 5b96b7c

Browse files
committed
Fix connection lifecycle
1 parent 246345f commit 5b96b7c

File tree

2 files changed

+71
-8
lines changed

2 files changed

+71
-8
lines changed

tests/test_connections.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,22 @@ def _test_isolation_level_read_only(
5050

5151
maybe_await(cursor.execute_scheme("DROP TABLE foo"))
5252

53+
def _test_commit_rollback_after_begin(
54+
self,
55+
connection: dbapi.Connection,
56+
isolation_level: str,
57+
) -> None:
58+
connection.set_isolation_level(isolation_level)
59+
60+
for _ in range(10):
61+
maybe_await(connection.begin())
62+
maybe_await(connection.commit())
63+
64+
for _ in range(10):
65+
maybe_await(connection.begin())
66+
maybe_await(connection.rollback())
67+
68+
5369
def _test_connection(self, connection: dbapi.Connection) -> None:
5470
maybe_await(connection.commit())
5571
maybe_await(connection.rollback())
@@ -377,6 +393,26 @@ def test_isolation_level_read_only(
377393
connection, isolation_level, read_only
378394
)
379395

396+
@pytest.mark.parametrize(
397+
("isolation_level"),
398+
[
399+
(dbapi.IsolationLevel.SERIALIZABLE),
400+
(dbapi.IsolationLevel.AUTOCOMMIT),
401+
(dbapi.IsolationLevel.ONLINE_READONLY),
402+
(dbapi.IsolationLevel.ONLINE_READONLY_INCONSISTENT),
403+
(dbapi.IsolationLevel.STALE_READONLY),
404+
(dbapi.IsolationLevel.SNAPSHOT_READONLY),
405+
],
406+
)
407+
def test_commit_rollback_after_begin(
408+
self,
409+
isolation_level: str,
410+
connection: dbapi.Connection,
411+
) -> None:
412+
self._test_commit_rollback_after_begin(
413+
connection, isolation_level
414+
)
415+
380416
def test_connection(self, connection: dbapi.Connection) -> None:
381417
self._test_connection(connection)
382418

@@ -448,6 +484,29 @@ async def test_isolation_level_read_only(
448484
read_only,
449485
)
450486

487+
@pytest.mark.asyncio
488+
@pytest.mark.parametrize(
489+
("isolation_level"),
490+
[
491+
(dbapi.IsolationLevel.SERIALIZABLE),
492+
(dbapi.IsolationLevel.AUTOCOMMIT),
493+
(dbapi.IsolationLevel.ONLINE_READONLY),
494+
(dbapi.IsolationLevel.ONLINE_READONLY_INCONSISTENT),
495+
(dbapi.IsolationLevel.STALE_READONLY),
496+
(dbapi.IsolationLevel.SNAPSHOT_READONLY),
497+
],
498+
)
499+
async def test_commit_rollback_after_begin(
500+
self,
501+
isolation_level: str,
502+
connection: dbapi.AsyncConnection,
503+
) -> None:
504+
await greenlet_spawn(
505+
self._test_commit_rollback_after_begin,
506+
connection,
507+
isolation_level
508+
)
509+
451510
@pytest.mark.asyncio
452511
async def test_connection(self, connection: dbapi.AsyncConnection) -> None:
453512
await greenlet_spawn(self._test_connection, connection)

ydb_dbapi/connections.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -234,20 +234,22 @@ def begin(self) -> None:
234234

235235
@handle_ydb_errors
236236
def commit(self) -> None:
237-
if self._tx_context and self._tx_context.tx_id:
237+
if self._tx_context:
238238
settings = self._get_request_settings()
239239
self._tx_context.commit(settings=settings)
240-
self._session_pool.release(self._session)
241240
self._tx_context = None
241+
if self._session:
242+
self._session_pool.release(self._session)
242243
self._session = None
243244

244245
@handle_ydb_errors
245246
def rollback(self) -> None:
246-
if self._tx_context and self._tx_context.tx_id:
247+
if self._tx_context:
247248
settings = self._get_request_settings()
248249
self._tx_context.rollback(settings=settings)
249-
self._session_pool.release(self._session)
250250
self._tx_context = None
251+
if self._session:
252+
self._session_pool.release(self._session)
251253
self._session = None
252254

253255
@handle_ydb_errors
@@ -424,21 +426,23 @@ async def begin(self) -> None:
424426

425427
@handle_ydb_errors
426428
async def commit(self) -> None:
427-
if self._session and self._tx_context and self._tx_context.tx_id:
429+
if self._tx_context:
428430
settings = self._get_request_settings()
429431
await self._tx_context.commit(settings=settings)
432+
self._tx_context = None
433+
if self._session:
430434
await self._session_pool.release(self._session)
431435
self._session = None
432-
self._tx_context = None
433436

434437
@handle_ydb_errors
435438
async def rollback(self) -> None:
436-
if self._session and self._tx_context and self._tx_context.tx_id:
439+
if self._tx_context:
437440
settings = self._get_request_settings()
438441
await self._tx_context.rollback(settings=settings)
442+
self._tx_context = None
443+
if self._session:
439444
await self._session_pool.release(self._session)
440445
self._session = None
441-
self._tx_context = None
442446

443447
@handle_ydb_errors
444448
async def close(self) -> None:

0 commit comments

Comments
 (0)