Django select_for_update 不能在事务外使用

新手上路,请多包涵

我使用的是 Django 1.5.1 并升级到 Django 1.6.6。

在 Django 1.5.1 中,我使用 select for update 来保证原子执行。

 # "views.py"

from django.db import transaction

def some_method():
    job_qs = Job.objects.select_for_update().filter(pk=job.id)
    for job in job_qs:

不幸的是,这现在会引发错误:

   File "/srv/venvs/django-picdoc/local/lib/python2.7/site-packages/django/db/models/query.py", line 96, in __iter__
    self._fetch_all()

  File "/srv/venvs/django-picdoc/local/lib/python2.7/site-packages/django/db/models/query.py", line 857, in _fetch_all
    self._result_cache = list(self.iterator())

  File "/srv/venvs/django-picdoc/local/lib/python2.7/site-packages/django/db/models/query.py", line 220, in iterator
    for row in compiler.results_iter():

  File "/srv/venvs/django-picdoc/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 713, in results_iter
    for rows in self.execute_sql(MULTI):

  File "/srv/venvs/django-picdoc/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 776, in execute_sql
    sql, params = self.as_sql()

  File "/srv/venvs/django-picdoc/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 147, in as_sql
    raise TransactionManagementError("select_for_update cannot be used outside of a transaction.")

TransactionManagementError: select_for_update cannot be used outside of a transaction.

解决这个问题的一些解决方案是什么?

原文由 Kingpin2k 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
1 个回答

答案在错误中,将查询包装在事务中

Django 的文档位于: https ://docs.djangoproject.com/en/dev/topics/db/transactions/#django.db.transaction.atomic

一种方法是:

 # "views.py"

from django.db import transaction

def some_method():
    with transaction.atomic():
        job_qs = Job.objects.select_for_update().filter(pk=job.id)
        for job in job_qs:

原文由 Kingpin2k 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题