On Sweetmorn, Bureaucracy 2, 3170 YOLD, Dieter Maurer wrote:
... get_transaction().commit() self.Cart().ThrowIn(self.REQUEST)
It seems to work for now but I'm not really sure if such messing with something usually done automagically by Zope won't have some obscure and nasty side effects. Am I doing something dangerous now or is this the Right Way to deal with my problem and if it's not then what is?
In general, it is not a good idea to explicitly commit a transaction:
If after the "commit" a "ConflictError" occurs (which is not that unlikely when you modify the ZODB), then the publisher will retry the requests. This means that the transaction you already committed is performed again.
In my case, if request is replayed exactly as if from the Web, it shouldn't do any harm. Before committing I leave `completion mark' in session variables so that on next hit on the same URL application goes directly to self.Cart().ThrowIn() (ThrowIn() gets all data from SESSION and nothing directly from REQUEST), so either my data was saved to SESSION, Cart() raises Unauthorized (or not) and CookieCrumbler takes control (or not), or my data was not saved and it gets created again from the same request, completion mark is saved, this time successfully, code goes on to Cart(), and Unauthorized is raised (or not). In either case, data is either completed in SESSION, marked as such and not touched again regardless of REQUEST, or it's not there and REQUEST is processed once again beginning from state identical to request start. Please correct me if I'm wrong at some point or if there's some other way to save data and let it survive an exception. -- __ Maciek Pasternacki <maciekp@japhy.fnord.org> [ http://japhy.fnord.org/ ] `| _ |_\ / { ...For I was born with a habit, from a sign, ,|{-}|}| }\/ the habit of a windswept thumb, \/ |____/ and a sign of the rain... } ( Fish ) -><-