[Zope] Transactions and rollback
Dennis Allison
allison@sumeru.stanford.EDU
Sat, 4 May 2002 11:14:46 -0700 (PDT)
I am building a Zope site where a manager enrolls users. A manager
completes a form that gathers information about the user. When submitted,
the action routine does two things --
.. updates a MySQL database with the user information
.. updates acl_users locally to manage the login
The MySQL is of a vintage that supports transactions so (per the Zope
book) that update will go as a transaction and will either succeed or
fail. Likewise, the acl_user update is a transaction and will either
succeed or fail.
My code needs to keep everything in sync and treat everything as a single
transaction, committing only when both the MySQL and the ZOODB
updates succeed, otherwise backing out. The problem is figuring out how
to do this.
Is there a general mechanism?
If there isn't, then another approach is to do the acl_user update first
since it can be undone (assuming I can get a handle on the transaction),
then the MySQL transaction. If the latter fails, I can back out of the
acl_user transaction by undoing it.
I am using Z SQL methods for the MySQL side of things--they provide a
nice wrapper. A few things are unclear from the docs. What exception
gets raised by a Z SQL method if it does not commit?
On the acl_users side, the updates are managed through External Methods as
noted in the code. Currently they just make calls on UserFolder per the
in-line documentation. This can fail. For example, what exception is
raised when an attempt is made to add a name already in use. (Are these
documented somewhere?) I presume that an exception in the External Method
will get exported out to an enclosing <dtml-try> block so it can be
captured and delt with in the web portion of the system.
If I need to back off a committed transaction in the ZOODB, how is that
done programatically. Presumably I can do the equivalent of the undo
management screen progrmatically, but to do do, I need the handle of the
transaction I want/need to undo. I don't see how to get it.
Thanks for help.