在 Django 的 ORM 中,有没有办法检测代码是否在事务内部执行?

In Django's ORM, is there a way to detect whether code is executing inside a transaction?

例如,我想要这个功能:

from django.db import transaction


with transaction.atomic():
    assert inside_transaction() == True


assert inside_transaction() == False

有办法实现吗?或者如果不是在 Django 的 ORM 中,是否可以直接在 psycopg2 中检测?

查看 Atomic class 的 source code [GitHub]transaction.atomic 使用,它在连接上设置了标志 in_atomic_block。因此,如果你想检查你的代码是否在交易中,你可以写如下:

with transaction.atomic():
    assert transaction.get_connection().in_atomic_block == True

assert transaction.get_connection().in_atomic_block == False

注意:如果您指定using调用[=13],get_connection函数可选地接受一个参数using =],你也应该将它传递给 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