[ZODB-Dev] Webkit Threading and ZODB 3.3a2: problems on Windows
Matt Feifarek
matt at dalchemy.com
Thu Feb 19 17:24:43 EST 2004
Shane Hathaway wrote:
>It sounds like a servlet can re-awaken in a different thread from the one
>in which it was put to sleep. If that happens, changes made before
>sleeping get registered with a different transaction than the transaction
>being committed. The new transaction is unaware of the change. Later,
>you might accidentally commit or abort the original transaction. What a
>mess!
>
>
I'm not sure I understand, no changes are EVER made before sleeping
without a commit. But here's a better re-cap of what I DO understand:
1. A servlet either exists, or is instantiated
2. As a part of it's building of state, it gets a database connection,
and then a handle on an object in the db
3. If no changes are made to the object, no get_transaction().commit()
is run
(we know if changes are made, with good certainty)
4. If changes ARE made, we do call get_transaction().commit()
5. Before the servlet "shuts down" we assign the references to the
object, to the root, to the connection all to None (but we do NOT
delattr() them...)
6. The servlet is removed back to the pool, waiting to be deployed into
a different thread
(there should be no object references or root or connection
references at this point)
I don't understand how there could be any transaction confusion. How
could one "transaction" stay around from one servlet lifecycle to the
next? Why would it stay in the thread if it was never used or after it
was commited? I have seen that connection instances are re-used when you
get a "new" one... but only one of two things can happen: no changes
have been made (therefore no "transaction", right?) OR changes are made
and IMMEDIATELY after, we commit() the transaction.
Somewhere in there lies my misunderstanding: do "transactions" stay
around, even after they are committed? And are there "transactions" that
exist even if no data has been changed? If there are, so what? Why does
code have to treat them so lightly if it didn't actually do anything?
>If the above guess is correct, you would benefit from the experimental
>support for binding transactions to connections (like Kapil mentioned.)
>Your servlets span threads; therefore, transactions should be bound to
>connections rather than threads.
>
>
This seems reasonable. But I'd still like to try and understand the
nature of transactions.
Thanks again. This whole thread has been extremely helpful!
More information about the ZODB-Dev
mailing list