Hey Simon, Thank you for your response, we were able to resolve the problem soon after I posted the query.
And yes, you are correct, it was an issue with having multiple DB connections and the `auto-commit` being turned off for one, but then another connection being used for querying. We earlier had a master-slave configuration for our DB and were using a DB router to route all reads to the slave. That is still in use and that is why the `deafualt` connection was used as we entered the `atomic` block, but `slave` when we made the read. Thank you again. On Thu, Mar 30, 2017 at 4:39 AM Simon Charette <[email protected]> wrote: > Hi Ketan, > > I'm afraid this will be really hard to solve without the code that is > raising this exception. > > Some details that could help debug the issue: > > 1. Are your workers multi-threaded? > 2. Are you sure you are not calling functions performing manual > transaction management? > 3. Is your atomic() block using the same database involved in the > select_for_update() call? > > e.g. Are you using transaction.atomic() (which will use the default > database) > but have database routers that could route reads/writes to another db? > > Cheers, > Simon > > Le samedi 25 mars 2017 15:08:19 UTC-4, Ketan Bhatt a écrit : > > I have a method that updates a row in the table. > To avoid race condition, I locked the row using `select_for_update` inside > an `atomic` block and doing the update. > This method is called from a celery task. > > This works well on my local machine. But when this gets called on my > production server (two tasks being picked up by two workers at the same > time and therefore trying to access the same row at once), I get: > `TransactionManagementError('select_for_update cannot be used outside of > a transaction.',)` > > I checked that to use `select_for_update`, autocommit should be False. > Inside the atomic block `get_autocommit` returns False. > > Now on production this must be returning `TRUE`. > > > What could be the reason? > > -- > You received this message because you are subscribed to the Google Groups > "Django users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at https://groups.google.com/group/django-users. > To view this discussion on the web visit > https://groups.google.com/d/msgid/django-users/91f6b088-e255-4ff9-a9c5-f033ffdf4211%40googlegroups.com > <https://groups.google.com/d/msgid/django-users/91f6b088-e255-4ff9-a9c5-f033ffdf4211%40googlegroups.com?utm_medium=email&utm_source=footer> > . > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/django-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CACyRkBVpKO1Khuf4Z%3D_PggA3TPcFa92anCgC_p_tzw92kwbQVw%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.

