Django select_for_update cannot be used outside of a transaction

I used Django 1.5.1 and upgraded to Django 1.6.6.

In Django 1.5.1, I used select to upgrade to ensure atomic execution.

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

Unfortunately, this now causes an error:

  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. 

What are some of the solutions for this?

+5
source share
1 answer

Error response, complete the request in the transaction

Django documentation is here: https://docs.djangoproject.com/en/dev/topics/db/transactions/#django.db.transaction.atomic

One approach:

 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: 
+16
source

Source: https://habr.com/ru/post/1200938/


All Articles