On Thu, 23 Jun 2011 03:59:49 +0200, Zygmunt Krynicki 
<zygmunt.kryni...@linaro.org> wrote:
> W dniu 22.06.2011 00:21, Michael Hudson-Doyle pisze:
> 
> >> Fortunately django almost never runs in autocommit mode. There is an
> >> implicit transaction around the whole request. It is easy to control the
> >> transaction processing around a piece of code, see [1].
> >
> > I got very confused by this, I admit.  In general, calling .save() on a
> > model does a COMMIT, unless you're managing the transactions yourself
> > (or using TransactionMiddleware)?
> 
> Something like that.
> 
> It's easier to read the source than read my explanations.
> django.db.models.base:Model.base_save() calls
> transaction.commit_unless_managed().

OK.

> In practice, django is almost always managed so save is never commits.

Really?  TransactionMiddleware isn't installed by the settings file that
django-admin startapp creates.  Is this just a crummy default that
everyone changes?

> The transaction middleware you mentioned makes django views "managed" 
> using commit_on_success decorator on the request method. You need to 
> disable that manually and I don't see any reason why someone would such 
> a thing.

See above.

> > And of course, the way this is being done in the scheduler at the moment
> > is not part of the web app, so the "usual" stuff doesn't always apply.
> >
> >> On PostgreSQL we also need to properly implement handling of
> >> IngegrityError as it differs significantly from SQLite [2]
> >
> > It's just that it dooms transactions, right?
> 
> Not really, it just makes supporting them a little trickier. I do that 
> with deserialization of bundles. In practice it's quite easy if you 
> remember to use save points correctly. See my 1-4 points below for 
> explanation why.
> 
>   The approach we'll take on
> > integrity errors is to rollback and retry so that's easy.
> 
> You can rollback to a savepoint.

Yeah, but there's no reason to do that in getJobForBoard.

> > (it's confusing that
> > https://docs.djangoproject.com/en/dev/topics/db/transactions/#transaction-rollback
> > says that the changes made by a.save() will be lost when the default is
> > for .save() to commit, so they must be assuming that you're using
> > TransactionMiddleware).
> 
> It's not only transaction middleware. Any code that earlier (in the call 
> history of a particular function) enabled transactions will behave this way.

Sure, but it's a bit disingenuous to not mention that in the
documentation I think.  I guess I should file a ticket.

> In reality this is all manageable:
> 
> 1) Proper code will work regardless autocommit mode :-)
> 2) PostgreSQL does not break things, you just need to take account for 
> savepoints.
> 3) Handling transactions manually implies you use savepoints and thus 
> get 1 and 2 right.

s/savepoints/savepoints or transactions/ -- there's no requirement to
involve savepoints if you don't need to.

> 4) Handling transactions automatically (around a view) implies you get 
> shielded from most of the complexity, if your actual application logic 
> is happy not to use explicit manual transactions in such cases.

Yeah, it's very good default for webapps.  Launchpad does that, but goes
even further: it automatically does a rollback when a GET method
completes, and uses SERIALIZABLE isolation level, retrying a method if
the commit fails due to a serialization violation.

However the code I'm working on is not part of a webapp :)

https://code.launchpad.net/~mwhudson/lava-scheduler/daemon-v1/+merge/65616 btw.

Cheers,
mwh

_______________________________________________
linaro-dev mailing list
linaro-dev@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev

Reply via email to