Django:atomic():强制事务,如果已经在事务中,则引发AssertionError

2024-10-01 04:45:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Django中的atomic()有问题:

https://docs.djangoproject.com/en/1.7/topics/db/transactions/#django.db.transaction.atomic

对于某些方法(在请求/响应周期之外调用),我需要确保该方法在一个事务中执行。我一定要坚持耐用性。atomic()如果已经在事务中,则将静默地使用保存点。在

记住:酸http://en.wikipedia.org/wiki/ACID

  • 原子性
  • 一致性
  • 隔离
  • 耐用性,这就是我想要的。在

atomic()的关键字参数savepoint在这里没有帮助。{savepoint根据^你已经不做任何事了。在

如果已经有事务在运行,我需要一个异常。在

不幸的是,旧的is_managed()被弃用,没有替换。在

如何创建atomic_raise_exception_if_already_in_transaction()装饰器?在


Tags: django方法httpscomdocsdb事务en
2条回答

检测数据库连接上是否有事务正在运行取决于数据库后端库的行为。E、 g.psycopg2for postgresql在上一个事务完成后提交新查询时会隐式启动新事务,除非已打开显式自动提交模式。在前一种情况下,所有查询都将在事务内运行,因此除了提交当前事务外,没有任何可靠的检查。在

另一方面,您可以检测是否有atomic块处于活动状态,请参见docs。您可以使用connection.in_atomic_block属性来检查是否激活了atomic块。在

如果只使用atomic(),则可以检查连接的in_atomic_block属性:

>>> from django.db import transaction
>>> transaction.get_connection().in_atomic_block
False
>>> with transaction.atomic():
...     print transaction.get_connection().in_atomic_block
... 
True
>>> transaction.get_connection().in_atomic_block
False
>>> 

相关问题 更多 >