[Zope-dev] FW: Zope & optimistic transactions.
Clark OBrien
COBrien@isis-server.vuse.vanderbilt.edu
Fri, 30 Nov 2001 11:48:19 -0600
This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.
------_=_NextPart_000_01C179C7.3292F870
Content-Type: text/plain;
charset="iso-8859-1"
> -----Original Message-----
> From: Clark OBrien
> Sent: Monday, November 05, 2001 7:14 AM
> To: 'chrism@zope.com'; 'k_vertigo@yahoo.com'
> Cc: 'zope@zope.org'
> Subject: Zope & optimistic transactions.
>
>
> Chris,
> I set up a test harness to exercise zopes optimistic transaction
> management.
> My test immediatly caused a ZODB exception.
>
> I am running zope 2.42. on win 2k, the scripts are attached.
> Results below:
>
> As you recall I posed the following question:
>
> What if you had a directory structure like:
> Folder1
> Folder-2
> Folder-3
> ...
> ..
> Folder-n
> Each folder had an attribute foo and there were two scripts, script1 and
> script2.
> script1 modified foo on one Folder only while script2 traversed all the
> folders modifying the attribute foo on each one of them.
> Would the script2 ever commit while the fist while script1 was
> continuously called. This is interesting because a call to script2 would
> never finish before several calls to script1 finished.
>
> I set up a simple test with only 10 folders. I then wrote the script below
> changeLevel2 that is my scri1 above and changeFolders that is my script2
> above.
> I ran changeLevel2 in a loop using the following code:
> ----------------------------------------script----------------------------
> -------------------
> import urllib
> params = urllib.urlencode({'theText': 'Vitamin D'})
> while 1:
> f = urllib.urlopen("http://localhost:8080/Test/changeLevel2?%s" % params)
> print f.read()
> -----------------------------------------script---------------------------
> ---------------------
>
>
> I then ran the script changeFolders from my browsers.
> The result was the following error message:
>
> ------------------------------------------------------------
> ZODB.POSException.ConflictError
>
> Sorry, a site error occurred.
>
> Traceback (innermost last):
> File C:\zope\lib\python\ZPublisher\Publish.py, line 223, in
> publish_module
> File C:\zope\lib\python\ZPublisher\Publish.py, line 200, in publish
> File C:\zope\lib\python\ZPublisher\Publish.py, line 200, in publish
> File C:\zope\lib\python\ZPublisher\Publish.py, line 200, in publish
> File C:\zope\lib\python\ZPublisher\Publish.py, line 195, in publish
> ----------------------------------------------------------
>
>
>
> <<scripts.txt>>
------_=_NextPart_000_01C179C7.3292F870
Content-Type: text/plain;
name="scripts.txt"
Content-Disposition: attachment;
filename="scripts.txt"
-----------------------------changeFolder ------------------------------------------------------
#changeFolder
#params list: theFolder,theText
theFolder.manage_changeProperties({'foo':theText})
----------------------------------end changeFolder-----------------------------------------------
-----------------------------------changeFolders--------------------------------------------------
#changeFolders
#Paramater list: myString
# this method changes the attribute foo on several folders.
newFolder = context.getChild("TestFolder" )
newFolder.manage_changeProperties({'foo':myString})
import string
for i in range(1,10):
newFolder = newFolder.getChild("TestFolder" )
for i in range(1,10):
# lets do something expansive
#for j in range(1,100):
#string.find("its a great day to code python","day")
newFolder.manage_changeProperties({'foo':myString})
return "all properties changed"
----------------------------------------------end changeFolders----------------------------------------
---------------------------------------------changeLevel2------------------------------------------------
#changeLevel2
#paramater list: theText
theFolder = context.getChild("TestFolder" )
context.changeFolder(theFolder,theText)
return 'ok'
---------------------------------------------end changeLevel2--------------------------------------------
---------------------------------------------createFolders-----------------------------------------------
temp = context.manage_addFolder('TestFolder','TestFolder')
newFolder = context.getChild("TestFolder" )
newFolder.manage_addProperty("foo","this is a test string", "string")
for i in range(1,10):
newFolder.manage_addFolder("TestFolder","TestFolder")
newFolder = newFolder.getChild("TestFolder" )
newFolder.manage_addProperty("foo","this is a test string", "string")
--------------------------------------------end createFolders -----------------------------------------------
---------------------------------getChild-------------------------------------------------------------------
#getChild
#param list: child
"""
getChild: Utility function
Returns ObjectManagerItem whose ID matches child parameter.
Context must be ObjectManager.
"""
for (oid, obj) in context.objectItems():
if oid == child:
return obj
else:
return None
----------------------------------------end getChild -----------------------------------------------------
----------------------------------------makeNewFolder-----------------------------------------------------
#makeNewFolder
#param list: root
root.manage_addFolder('TestFolder','TestFolder')
root.manage_addProperty('foo','The world is round only to those who know it',"string")
return root.getChild('TestFolder')
--------------------------------------end makeNewFolder-----------------------------------------------
------_=_NextPart_000_01C179C7.3292F870--