On 12/18/05, Jan-Ole Esleben <esleben@gmail.com> wrote:
To simplify, in ZOPE, for any given product, during a transaction the product is effectively locked. This statement is incorrect.
You're right. It should be "during any transaction where there are potential changes to the object".
No, this statement is still correct. Replace "product" with "object" and you are right.
And I agree, it's actually a lot more complicated than I'd thouht at first.
Or simpler. ;-)
but it happens under rather magical circumstances. I have an example where it actually happens; this is code from a product that is instantiated twice, one of those instances called TPCDest, the other TestPChanged; the method called directly is "TestPChanged.test()":
security.declareProtected("Use TestPChanged", "test_internal") def test_internal(self, args=None, args2=None): "Called by test via XML-RPC" if args2: self.a.append(1) self._p_changed = 1 if not args: import xmlrpclib s = xmlrpclib.ServerProxy("http://USER:PASSWORD@localhost:8080/", allow_none=True) s.TestPChanged.test_internal(1) return self.a
security.declareProtected("Use TestPChanged", "test") def test(self, args2=None): "Called directly via ZOPE" if args2: self.a.append(1) self._p_changed = 1 import xmlrpclib s = xmlrpclib.ServerProxy("http://USER:PASSWORD@localhost:8080/", allow_none=True) return s.TPCDest.test_internal()
Zope obviously looks at the code, because if you remove the "if args2" (which is _never_ true), then a ConflictError happens.
Maybe I'm stupid, but could someone point out _where_ exactly I am?
I don't understand the question. I would like to point out that you set self._p_changed even when you don't change anything. :-) It seems to me that you say that if you process calls test and another calls test_internal, you get a conflict error. This is correct, and as noted before, that code would create a conflict in any type of environment. If you have two processes trying to modify the same dataset, which is what your example seems to do, then you get a conflict. What you claim, is that if you have two processes in Zope change two different datasets, you get a conflict. That statement is still false.
Yes. You said "different sets of data". That reasonably means different objects. If it doesn't, yuo need to take a long hard look at your object hierarchy.
Simply not true. What if I have a field titles (that is a hash of titles to Book objects) and a field comments (that is an array of comments on the library)? Is that so obviously not a sane example?
Yes, sorry, having non-persistent aware dictionaries or arrays, and then complaining that you have problems with persitency...
In ordinary systems, you would have to find a way to store the data and retrieve it, thus having a model that isn't implicit and entangled with your code.
What is implicit with it?
See the example for some major implicitness.
What is implicit with it?
It's also implicit because you have no control over what a transaction considers a tainted object. (You have no real control over the transaction).
Thats still not true.
I am explicitly talking about changing different sets of data within the same object. You noted that above yourself.
Then these different sets should be different objects, and the object should be an object container: Problem solved.
You claim that you can't control what a persistent class store. That is false.
I don't. I say that if I want to avoid such problems as I describe altogether, I cannot store anything in a persistent class and thus lose most of what makes ZOPE so interesting.
This is still not correct.
You claim that things get locked that shouldn't be locked in Zope. It is not clear to me why you say that.
See the example.
I don't see how the example examplifies this. It is obvious to me that you have misunderstood something. I don't know what yet, though. -- Lennart Regebro, Nuxeo http://www.nuxeo.com/ CPS Content Management http://www.cps-project.org/