例如,我想要这个功能:
from django.db import transaction
with transaction.atomic():
assert inside_transaction() == True
assert inside_transaction() == False
有办法实现这一点吗?或者如果不在 Django 的 ORM 中,是否可以直接在 psycopg2 中检测?
最佳答案
查看source code [GitHub]对于 transaction.atomic
使用的 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
是一个私有(private) 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
关于django - 在Django的ORM中,有没有办法检测代码是否在事务内执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69465595/