首页 > 解决方案 > 在 Django 的 ORM 中,有没有办法检测代码是否在事务中执行?

问题描述

例如,我想要这个功能:

from django.db import transaction


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


assert inside_transaction() == False

有没有办法做到这一点?或者如果不在 Django 的 ORM 中,是否可以直接在 psycopg2 中检测?

标签: djangopsycopg2django-orm

解决方案


查看它使用的类的源代码 [GitHub]在连接上设置一个标志。因此,如果您想检查您的代码是否在事务中,您可以编写以下代码:Atomictransaction.atomicin_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

推荐阅读