Skip to content

Commit 6674975

Browse files
committed
Fix connection lifecycle
1 parent 246345f commit 6674975

File tree

2 files changed

+67
-8
lines changed

2 files changed

+67
-8
lines changed

tests/test_connections.py

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

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

53+
def _test_commit_rollback_after_begin(self, connection: dbapi.Connection, isolation_level: str) -> None:
54+
connection.set_isolation_level(isolation_level)
55+
56+
for _ in range(10):
57+
maybe_await(connection.begin())
58+
maybe_await(connection.commit())
59+
60+
for _ in range(10):
61+
maybe_await(connection.begin())
62+
maybe_await(connection.rollback())
63+
64+
5365
def _test_connection(self, connection: dbapi.Connection) -> None:
5466
maybe_await(connection.commit())
5567
maybe_await(connection.rollback())
@@ -377,6 +389,26 @@ def test_isolation_level_read_only(
377389
connection, isolation_level, read_only
378390
)
379391

392+
@pytest.mark.parametrize(
393+
("isolation_level"),
394+
[
395+
(dbapi.IsolationLevel.SERIALIZABLE),
396+
(dbapi.IsolationLevel.AUTOCOMMIT),
397+
(dbapi.IsolationLevel.ONLINE_READONLY),
398+
(dbapi.IsolationLevel.ONLINE_READONLY_INCONSISTENT),
399+
(dbapi.IsolationLevel.STALE_READONLY),
400+
(dbapi.IsolationLevel.SNAPSHOT_READONLY),
401+
],
402+
)
403+
def test_commit_rollback_after_begin(
404+
self,
405+
isolation_level: str,
406+
connection: dbapi.Connection,
407+
) -> None:
408+
self._test_commit_rollback_after_begin(
409+
connection, isolation_level
410+
)
411+
380412
def test_connection(self, connection: dbapi.Connection) -> None:
381413
self._test_connection(connection)
382414

@@ -448,6 +480,29 @@ async def test_isolation_level_read_only(
448480
read_only,
449481
)
450482

483+
@pytest.mark.asyncio
484+
@pytest.mark.parametrize(
485+
("isolation_level"),
486+
[
487+
(dbapi.IsolationLevel.SERIALIZABLE),
488+
(dbapi.IsolationLevel.AUTOCOMMIT),
489+
(dbapi.IsolationLevel.ONLINE_READONLY),
490+
(dbapi.IsolationLevel.ONLINE_READONLY_INCONSISTENT),
491+
(dbapi.IsolationLevel.STALE_READONLY),
492+
(dbapi.IsolationLevel.SNAPSHOT_READONLY),
493+
],
494+
)
495+
async def test_commit_rollback_after_begin(
496+
self,
497+
isolation_level: str,
498+
connection: dbapi.AsyncConnection,
499+
) -> None:
500+
await greenlet_spawn(
501+
self._test_commit_rollback_after_begin,
502+
connection,
503+
isolation_level
504+
)
505+
451506
@pytest.mark.asyncio
452507
async def test_connection(self, connection: dbapi.AsyncConnection) -> None:
453508
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)