[Glass] Seaside applications and System writeLock:

Paul DeBruicker via Glass glass at lists.gemtalksystems.com
Wed Mar 7 17:33:31 PST 2018


Hi Bruno,


I don't know whether this is a good or bad strategy but this is what I'm
doing now.  

I keep a record of the lock and the locked objects in the session.  There is
only a small part of my app where I think locking is worth it.  When a user
wants to interact with that part of the app I lock the interesting set of
domain objects for them as part of the callback that loads that part of the
app. If acquiring that lock fails I don't let them do what they wanted to
do.  I just show a "I'm sorry it looks like someone else is already doing
that" message.  If they are working with locked objects and change to
another area of the app I release the lock on the objects.  If they log out
or their session expires I release the lock.  And after they complete the
task I release the lock.  The code is in my WASession subclass and for
locking I've added two inst vars: #locked and #objectsToLock

MySession>>#lockObjects: someObjects
	objectsToLock := someObjects.
	self acquireLocks.
	^ locked

MySession>>#acquireLocks
	locked := true.
	System
		writeLockAll: objectsToLock
		ifIncomplete: [ :denied :dirty :empty | 
			denied notEmpty
				ifTrue: [ 
					Transcript show: 'could not lock ' , denied asCommaStringAnd.
					Transcript show: 'owner ' , (System lockOwners: denied first) asString
].
			dirty notEmpty
				ifTrue: [ Transcript show: 'dirty locks for ' , dirty asCommaStringAnd
].
			self clearLocks ]	

MySession>>#clearLocks
	self hasLockedObjects
		ifTrue: [ 
			System removeLockAll: objectsToLock.
			objectsToLock removeAllSuchThat: [ :ea | (System lockOwners: ea) isEmpty
].
			locked := objectsToLock notEmpty.
			locked
				ifTrue: [ Transcript show: 'clear lock attempted but not completed ' ,
objectsToLock asCommaStringAnd ]
				ifFalse: [ objectsToLock := Array new	 ] ]	


MySession>>#hasLockedObjects
	^ locked or: [ objectsToLock notEmpty ]

MySession>>#anyLocked: aCollection
	^ aCollection anySatisfy: [ :obj | (System lockOwners: obj) notEmpty ]

MySession>>#unregister
	self clearLocks.
	super unregister

MySession>>#unregistered
	self clearLocks.
	super unregistered



In the app itself before entering the special area I send 

self session lockObjects: self specialObjects
self session hasLockedObjects 
       ifTrue:[ "render the special area"] 
       ifFalse:["render the "im sorry" message" ].



I haven't run into any problems yet but that doesn't mean I won't run into
any problems with the above.  Hope this helps


Paul








GLASS mailing list wrote
> Ciao,
> 	
> 	i have a Seaside application and i used		 writeLock: 	to manage
> transaction conflicts on specific objectA.
> 
> 	If the code in first session get  a	 writeLock:   objectA
> 
> 	and before commitTransaction		  another  session  get  the		 writeLock: 	
> on the same objectA
> 
> 	how does the system behave?
> 
> 		The last writeLock:  		how it behaves?
> 
> 		It resubmit the request   for  some time?  how many times?
> 
> 	How the Seaside framework manage this problematic?
> 
> 	How i cam manage it?
> 
> 	I read the GS64 Program Guide "Transaction and Concurrency Control" .
> 
> 	Is the case of using Application Write Lock ?
> 
> 	Thanks for considerations...
> 
> 		Dario
> 
>  
> 
> _______________________________________________
> Glass mailing list

> Glass at .gemtalksystems

> http://lists.gemtalksystems.com/mailman/listinfo/glass





--
Sent from: http://forum.world.st/GLASS-f1460844.html


More information about the Glass mailing list