[Zope-DB] Avoid Lost Updates?
M.-A. Lemburg
mal@lemburg.com
Wed, 16 Oct 2002 13:54:38 +0200
Martin Gebert wrote:
> Hi all!
>
> I didn't found much about this issue, so I'd like to ask this list.
> Please correct me if I'm stating anything wrong...
>
> Zope provides transaction management for RDBMS bound to it's internal
> transactions - begin and end of a TA are marked by Request and Response
> (request for the page until end of uploading it). This surely is a
> convincing and quite secure concept, working for the most practical
> purposes.
> The problem is how to manage longer transactions which spread over two
> or more requests, esp. in combination with locking? Locking is bound to
> commit/rollback cycles, too.
>
> The problem I face is the following:
> Consider a person retrieving his personal data from an RDBSM
> (MySQL/InnoDB) via Web (Zope) to change it. After that he presses the
> submit button to write the data back.
> If this person takes a while for entering, and some other person (e. g.
> with a manager role) changes his data in the meanwhile and saves
> *before* the other one, this update will be overwritten with the update
> of our first person and is simply lost.
> Doing an exclusive lock ("for update") on retrieving isn't of much use,
> for the lock will be set back at the moment the result page was sent to
> the client; the transaction is at it's end there and a new one begins,
> ending with sending the updated data back to the DBMS (or cancelling the
> process).
>
> I know this is an old problem, and due to the statelessness of the HTTP
> protocol. But I've already seen a Zope site which was trying to keep the
> Request up until the submitting of the site, which showed as a
> neverending retrieval of the page (the "Loading..." sign in the browser
> didn't stop until you either hit the "Stop" button, went to another
> page, or pressed "Submit").
>
> My question is:
> Is there any way in Zope to extend TAs over a couple Requests, e. g. to
> keep the Request open as described above? Is this a practical solution,
> and what are the problems (there are at least timeout issues)? May there
> be a solution which is based on the DBMS (ignoring commits to keep the
> TA open)??? Or is this one of the long-known-and-so-far-unresolved
> problems of Web programming?
>
> Thank you for reading that far!
Why don't you save the data and the locking information in a
persistent user object and only write the new data to the database
when the user has finished working it ?
(locks should have a timeout builtin in order to avoid deadlocks
if the user never gets to the finishing state)
--
Marc-Andre Lemburg
CEO eGenix.com Software GmbH
_______________________________________________________________________
eGenix.com -- Makers of the Python mx Extensions: mxDateTime,mxODBC,...
Python Consulting: http://www.egenix.com/
Python Software: http://www.egenix.com/files/python/