All good stuff, thanks.  I have some follow-ups.

-Are you telling me that I cannot roll back transactions unless I rip
out the middleware?  There's no accessible command to the middleware
with TG2 as it ships?

-How can I lock a table?  I thought that was done by TG as well - that
each call to a controller made the database safe to access.

-I actually do want to roll back *all* the previous transactions made
in that sessions.  It was an all-or-nothing scenario.  If there's a
single duplicate in that database, then I want to remove all of the
new entries added during this call.  I would expect rollback()
wouldn't remove items already in the database from a previous call to
the controller (which ends with a commit() as I understand it, perhaps
in repoze.tm2 as you point out?)

If this is documented from a TG2 perspective somewhere, I would love
to know where - I'm not afraid of reading, but figuring out how SQL
Alchemy is integrated with TG2 has been difficult.  Thanks for the
help.


El Tea

On Jul 30, 2:32 am, "Diez B. Roggisch" <[email protected]> wrote:
> El Tea schrieb:
>
>
>
> > Let me preface this by saying I may still not having a sufficient
> > grasp of SQL Alchemy.
>
> > I am adding a set of entries to the database, one at a time.  Before
> > adding each entry I check to ensure a similar entry is not in the
> > database.  If there is, I consider the entire set invalid and attempt
> > to do a rollback.  So, in pseudocode:
>
> > Loop through my input data:
> >    Query DB to check for duplicate
> >    if not duplicate:
> >            DBSession.add(entry)
> >    if duplicate:
> >            DBSession.rollback()
> >            return #Returns to the controller method, which then returns 
> > result
> > data for rendering.
>
> > I keep getting the following error:
>
> > InvalidRequestError: The transaction is closed
>
> Transactions in TG2 are managed through the repoze.tm2 middleware, *not*
> by you. Unless of course you rip that out, as we did. But that's another
> story.
>
> However, in any case the above code is faulty. You don't rollback a
> transaction when you'd have a duplicate entry, because then you'd
> rollback *all* the previously successfull creations. That's the way
> transactions work.
>
> Instead, you do nothing.
>
> And if you want to make 100% sure you don't run into a race-condition,
> you first lock the table you are working with, because otherwise it can
> happen that between checking for a row, and creating it, it is created
> by another request.
>
> Diez
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"TurboGears" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/turbogears?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to