Есть ли в ORM Django способ определить, выполняется ли код внутри транзакции?
Например, мне нужна такая функция:
from django.db import transaction
with transaction.atomic():
assert inside_transaction() == True
assert inside_transaction() == False
Есть ли способ достичь этого? Или возможно ли это обнаружить непосредственно в psycopg2, если не в ORM Джанго?
Посмотрев на исходный код [GitHub] для класса Atomic
, который используется transaction.atomic
, он устанавливает флаг in_atomic_block
на соединении. Следовательно, если вы хотите проверить, находится ли ваш код внутри транзакции, вы можете написать следующее:
with transaction.atomic():
assert transaction.get_connection().in_atomic_block == True
assert transaction.get_connection().in_atomic_block == False
Примечание: Функция get_connection
опционально принимает параметр using
, в случае если вы указываете using
для вызова transaction.atomic
, вы должны передать его и в get_connection
.
Лучше всего, поскольку get_connection
является частным API, просто написать небольшую собственную функцию для проверки этого:
from django.db import transaction
from django.db import (
DEFAULT_DB_ALIAS, connections,
)
def inside_transaction(using=None):
if using is None:
using = DEFAULT_DB_ALIAS
return connections[using].in_atomic_block
with transaction.atomic():
assert inside_transaction() == True
assert inside_transaction() == False