django - Django select_for_update不能在事务外部使用

标签 django transactions django-1.5 django-1.6

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

在Django 1.5.1中,我使用select进行更新以保证原子执行。

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.


有哪些解决方案可以解决此问题?

最佳答案

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

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

一种方法是:

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:

关于django - Django select_for_update不能在事务外部使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25451087/

相关文章:

django 发布复选框数据

django - Tastypie 以 Json 格式响应每个请求

django - django 中的一些静态文件提供 404 服务,而其他文件则不提供服务 - 有什么想法吗?

python - 如何在 Django ModelForms 中加载实例

django - 通过模板输出请求参数

jpa - 使用 Play Framework 提交事务

mysql - Cakephp3交易查找查询

java - 事务回滚时如何返回不同的值?

django - 使用 Django 管理模板标签

Python 元组到字典,带有额外的键列表