我使用的是 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 许可协议
答案在错误中,将查询包装在事务中
Django 的文档位于: https ://docs.djangoproject.com/en/dev/topics/db/transactions/#django.db.transaction.atomic
一种方法是: