I'll admit my MySQL skills are a bit rusty, but can you examine the database 
logs to confirm that the session is in fact doing the INSERT and a commit 
before the SELECT?

On May 28, 2013, at 10:52, Chris Conover <[email protected]> wrote:

> It's not really feasible to move this project to PostgreSQL.
> 
> I honestly just don't understand the problem. According to the Django 
> documentation, the ORM functions in autocommit mode by default. In other 
> words, the changes should be committed as soon as the query is complete, 
> right? So after an INSERT, you should be able to do a SELECT and the data 
> should be available. In the code written, the SELECT is definitely coming 
> after the INSERT. The code is not complex. I'm setting up a local test to 
> simulate the load on the production system to see if I can reproduce the 
> issue.
> 
> On Tuesday, May 28, 2013 1:33:10 PM UTC-4, Christophe Pettus wrote:
>> 
>> In the meantime, you can use this:
>> 
>>     https://github.com/Xof/xact
>> 
>> On May 28, 2013, at 10:29, Chris Conover <[email protected]> wrote:
>> 
>>> That seems to only be available in the dev version of Django (now 1.6 
>>> alpha).
>>> 
>>> On Wednesday, May 22, 2013 4:43:29 AM UTC-4, Christian Schmitt wrote:
>>>> 
>>>> if you want transactions you need to do :
>>>> 
>>>> with transaction.atomic():
>>>> 
>>>> like described here: 
>>>> https://docs.djangoproject.com/en/dev/topics/db/transactions/
>>>> 
>>>> Am Mittwoch, 22. Mai 2013 10:40:15 UTC+2 schrieb Christian Schmitt:
>>>>> 
>>>>> In Django the normal behavior should be that when you do a save() it will 
>>>>> automatically commit() your query's to the database.
>>>>> so that in obj.save() you should just could access the pk with obj.id 
>>>>> after you did a obj.save().
>>>>> If you want to maybe stop the commit you need to do a obj = 
>>>>> obj.save(commit=False), then you could add some things to your obj and 
>>>>> commit/save it later.
>>>>> But as i understood you already do a obj.save() but it doesn't commit 
>>>>> correctly? Maybe you should just try a PostgreSQL database for testing, 
>>>>> since I'm not having trouble looking up objects after i saved it.
>>>>> 
>>>>> I often do things like:
>>>>> obj.save()
>>>>> return HttpResponseRedirect(reverse('view', {'pk': obj.id}))
>>>>> and i never run into any exception
>>>>> 
>>>>> 
>>>>> Am Dienstag, 21. Mai 2013 23:20:53 UTC+2 schrieb Chris Conover:
>>>>>> 
>>>>>> Calling transaction.commit() after object.save results in a 
>>>>>> TransactionManagementError. I mentioned at the end that I am using MySQL 
>>>>>> (5.5.27). The issue is not that the Gearman workers are having trouble 
>>>>>> saving their transactions, it's that they are having trouble looking up 
>>>>>> the incoming object. I'm assuming the view and workers are separate 
>>>>>> transactions since I don't see how they could be connected -- though I'm 
>>>>>> looking into this. 
>>>>>> 
>>>>>> On Tuesday, May 21, 2013 1:05:54 PM UTC-4, Tom Evans wrote:
>>>>>>> 
>>>>>>> On Tue, May 21, 2013 at 4:23 PM, Chris Conover <[email protected]> 
>>>>>>> wrote: 
>>>>>>> > Hello, 
>>>>>>> > 
>>>>>>> > I'm having an issue looking up objects immediately after they are 
>>>>>>> > saved and 
>>>>>>> > am wondering if anyone has any advice on how to address the problem. 
>>>>>>> > Specifically, I'm saving an object in a view (nothing fancy, a simple 
>>>>>>> > save()) and then kicking off a Gearman task to do some operations on 
>>>>>>> > that 
>>>>>>> > saved object in the background. I pass the newly created object's PK 
>>>>>>> > as data 
>>>>>>> > to the Gearman worker which then does a simple 
>>>>>>> > Objects.objects.get(pk=PK). 
>>>>>>> > However, almost all of the time this lookup operation fails with an 
>>>>>>> > DoesNotExist exception. I believe the problem has to do with 
>>>>>>> > transactions. 
>>>>>>> > Namely, the read in the Gearman worker is happening before the write 
>>>>>>> > from 
>>>>>>> > the view is committed to the database. I've tried several things 
>>>>>>> > including 
>>>>>>> > refactoring the saving code to be wrapped in a 
>>>>>>> > @transaction.commit_on_success block, moving the worker submission to 
>>>>>>> > post_save and adding a long delay before the Gearman worker does the 
>>>>>>> > lookup. 
>>>>>>> > Nothing really seems to solve the problem completely. Even with a 60 
>>>>>>> > second 
>>>>>>> > delay, the lookup fails with some frequency. Am I missing something 
>>>>>>> > here? Is 
>>>>>>> > there some Django query cache that I can clear? Or should I just 
>>>>>>> > rewrite all 
>>>>>>> > this to just to use a look-back perspective. 
>>>>>>> > 
>>>>>>> > The stack is Django 1.4 connecting to MySQL 5.5.27. Django is 
>>>>>>> > handling 
>>>>>>> > 200-1000 requests per second and the database is handling about 
>>>>>>> > double that. 
>>>>>>> > 
>>>>>>> > Thanks, 
>>>>>>> > Chris 
>>>>>>> 
>>>>>>>   from django import transaction 
>>>>>>>   … 
>>>>>>>   obj.save() 
>>>>>>>   transaction.commit() 
>>>>>>>   task.submit(obj.id) 
>>>>>>> 
>>>>>>> You will also need to make sure that gearman is doing things correctly 
>>>>>>> as well. You haven't mentioned what database you are using, but if 
>>>>>>> gearman's DB connection is in a read repeated mode, you can do 
>>>>>>> whatever you like in django but you won't see new data in gearman 
>>>>>>> until gearman's current transaction is committed. 
>>>>>>> 
>>>>>>> Cheers 
>>>>>>> 
>>>>>>> Tom
>>> -- 
>>> 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 http://groups.google.com/group/django-users?hl=en.
>>> For more options, visit https://groups.google.com/groups/opt_out.
> 
> -- 
> 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 http://groups.google.com/group/django-users?hl=en.
> For more options, visit https://groups.google.com/groups/opt_out.
>  
>  

-- 
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 http://groups.google.com/group/django-users?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to