#25271: model object locking with select_related
-------------------------------------+-------------------------------------
     Reporter:  VathsalaAchar        |      Owner:  nobody
         Type:  Bug                  |     Status:  new
    Component:  Database layer       |    Version:  1.8
  (models, ORM)                      |   Keywords:  models, select_related,
     Severity:  Normal               |  resource locking
 Triage Stage:  Unreviewed           |  Has patch:  0
Easy pickings:  0                    |      UI/UX:  0
-------------------------------------+-------------------------------------
 I used select_related (django 1.6 on windows connected to sqlserver) and
 came across some unexpected behaviour.

 Here's an example that I tested with django 1.8 and sqlite:

 {{{

 class TestUser(models.Model):
     name = models.CharField(blank=True, max_length=255)


 class Account(models.Model):
     user = models.OneToOneField(TestUser)
     name = models.CharField(max_length=255)
     value = models.IntegerField(default=0)
 }}}


 I tried the following code against the models above to replicate the
 unexpected behaviour I noticed.

 {{{
  def some_method(some_id):
      t = TestUser.objects.select_related('account').get(id=some_id)

      # here is where the fun stuff happens
      alter_account(t.id)

      # the following changes are reflected in the db
      t.account.name= 'something else'
      t.account.save()


 def alter_account(uid):
      '''
      this method does not work as expected as the select_related in the
      previous method has locked the Account model out
      '''
      a = Account.objects.get(user__id=uid)
      a.value = 5
      a.save()

 test_user = TestUser.objects.create(name='test user')
 test_account = Account.objects.create(user=test_user, name='some account')
 }}}

 Initial state:
 {{{
 >>> test_account.name
 u'some account'
 >>> test_account.value
 0
 }}}

 Expected:
 {{{
 >>> test_account.name
 u'something else'
 >>> test_account.value
 5
 }}}

 Unexpected result:

 {{{
 >>> some_method(test_user.id)
 >>> test_account.name
 u'something else'
 >>> test_account.value
 0
 }}}

 I found this in our production code when the object state refused to
 update and caused us issues. I had to get rid of the select_related in the
 query to resolve the issue.

 Nowhere in the documentation is this behaviour explained, so I assume this
 is a bug.

--
Ticket URL: <https://code.djangoproject.com/ticket/25271>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" 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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/056.c2110a5ae6781236f6c62a842ab80c1c%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to