Есть ли в 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
Вернуться на верх