[Clark OBrien] I think I was sending to [EMAIL PROTECTED] my mistake- but an easy one to make. > From: Clark OBrien > Sent: Monday, November 05, 2001 7:14 AM > To: '[EMAIL PROTECTED]'; '[EMAIL PROTECTED]' > Cc: '[EMAIL PROTECTED]' > 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>>
-----------------------------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-----------------------------------------------