Re: How the transactions are done in the saveChanges?

Sebastien Bigaret <[email protected]> 06 Sep 2004 22:31:18 +0200
Newsgroups gmane.comp.python.modeling
Message-ID <[email protected]>
        Hi,

  Since this discussion was pending for a while, I leave here almost the
  whole the context

Marco Bizzarri <[email protected]> wrote:
> Sebastien Bigaret wrote:
> |         Hi,
> |
> | To all: I'll probably be off for a day or two from now, so
> | do not expect me to answer quickly in this period ;)
>=20
> No problem :)
>=20
> | Marco Bizzarri wrote:
> |
> |>Pfeeww... I didn't expect such a looong answer... :)
> |
> |
> | This will be very short one, before a more complete in the coming days.
> | I just want to correct something quickly:
> |
> | [...]
> |
> |>In a web environment, like Zope or whatever, you've a clear
> |>distinction of a transaction: the arrive of a request, the
> |>sending of response. All inside these two events can be
> |>considered a transaction; at least, this is what the user can
> |>perceive as a transaction.
> |
> | [...]
> |
> |>| Back on this, just a few words: having a single
> |>BEGIN/COMMIT or ABORT
> |>| per zope transaction means that you want to restrict what the
> |>| framework is able to do. Updates in an EC can take more
> |>than one zope
> |>| transaction to be achieved, for example if they are saved after
> |>| several html pages have been served one after the other (think of a
> |>| wizard, at the end of which you confirm or cancel the changes).
> |>
> |>I don't think this is possible in the current integration of
> |>MDL and Zope.
> |>
> |>IIRC, MDL register itself with the _finish method...
> |>
> |>~  def _finish(self):
> |>~    self.ec.lock()
> |>~    self.ec.saveChanges()
> |>~    self.ec.unlock()
> |>
> |>Now, this means that, at the end of *each* Zope transaction
> |>you will do a saveChanges on your ec. Therefore, if you
> |>update your objects inside the page of the wizard, they will
> |>be stored on the RDB.
> |
> |
> |
> | No, a session's EC is NOT bound by default to the zope TM,
> | (even if the _finish() method is used when it is bound to it)
> | cf. section 6.4. & 6.4.1 in the User's Guide.  If you observed
> | the oppposite this is definitely a bug that should be fixed.
>=20
> No, I was assuming the bind_saveChanges_to_zope_transactions behaviour.

Okay, fine.

> | So, basically, you should get exactly what you describe:
> |
> |>The above behaviour could be configurable. You could have an
> |>"auto-commit" EC and a "non-auto-commit" EC (i.e. different
> |>subclasses), and let the developer choose according to its need.
> |
> |
> | based on the ZEditingContextSessioning's property
> | 'bind_saveChanges_to_zope_transactions'. It IS possible to
> | decorrelate EC.saveChanges() and the zope TM, it should even
> | be the default (or, I repeat, this is definitely a bug).
> |
> | [...]
> |
> |>Also, even though you could in principle do some
> |>saveChanges() by yourself, this would be looking for havoc.
> |>Indeed, Zope relies on the fact that a transaction can be
> |>redone from the start, if something goes wrong.
> |
> |
> | Zope does not insist to rely on this if you insist of ignoring
> | its TM ;)
>=20
> I disagree.
>=20
> Zope itself uses a conflict resolution approach, where, aside from
> interactions with the RDB, you can have ConflictErrors, which are
> raised, catched by the ZPublisher which redo the transaction from the
> beginning.
>=20
> | Seriously, it's possible to build a whole application on this principle.
>=20
> [...]
>=20
> This is a point which is very interesting to me. However, I think you
> could be very limited on what you can use inside Zope... ZCatalogs, for
> example, should be exluded, because they can easily generate
> ReadConflictError.
>=20
> However, I suspect you have much more experience on this topic than me,
> and I would appreciate your point of view.

  Well, AFAIK (Read)ConflictErrors are handled within each storage and
  do not interfere with others --unless that, after the transaction has
  been retried n times, it is abandoned and makes the whole transaction
  fail.

However I can be wrong on this point and have no time to double-check
what I say, so if you have informations suggesting or proving the
contrary I'd be happy to hear from you.


  What I was saying with:

> | Zope does not insist to rely on this if you insist of ignoring
> | its TM ;)

  is that you can build a whole application without binding the DB txns
  (ec.saveChanges()) to zope txns  --and in fact that's exactly what I
  do.  This mean, in particular, that I never worked w/ applications
  where ec.saveChanges() are bound to the zope txn machinery, so I
  cannot be absolutely positive about what I'm saying above.

But some documents, such as TM.py or:
http://www.zope.org/Members/petrilli/WritingADA


  Now, I must double-check the design in ZECSessioning, I think I've
  just see a flaw in it: it should probably implement method tpc_vote()
  calling self.ec.validateChanges(), before any txns is actually
  committed.  Any comment, anyone?


> |>I think I should review a little... consider an application
> |>where you have a large number of users, 1000, perhaps, each
> |>having its own ec... should we notify each user of the changes?
> |
> |
> | Wow, I only meant notifying the ECs, not the users ;) unless you decide
> | so, obviously.
> |
> [...]
>=20
> Of course, my wording was not that good. If I have 1000 users active, I
> have 1000 sessions, with 1000 EC. I could have to notify to 999 EC when
> one makes a change... or not?

  Yes, you do have to --if you don't, then you can get inconsistencies.
  Of course, the notification process is quite fast, and the appropriate
  methods (solving inconsistencies) are only triggered when needed.


> |   Hopefully this succeeds some of my points in the previsou email a
> |   little clearer. Again, yes, this would be a lot clearer with a >
> |   tutorial, a zope dedicated section and a sample toy application...
>=20
> I would be happy to contribute something on this point...

Great :)

-- S=E9bastien.



-------------------------------------------------------
This SF.Net email is sponsored by BEA Weblogic Workshop
FREE Java Enterprise J2EE developer tools!
Get your free copy of BEA WebLogic Workshop 8.1 today.
http://ads.osdn.com/?ad_id=5047&alloc_id=10808&op=click