[Glass] Seaside transaction management
Trussardi Dario Romano via Glass
glass at lists.gemtalksystems.com
Thu Jun 8 12:30:29 PDT 2017
Ciao Johan,
thanks.
> Hi Dario,
>
> Seaside in Gemstone was written by Dale to implement a transaction for each request.
> If Seaside handles a request, this corresponds to a single transaction.
> If the commit fails, the request will be retried after an abort.
>
> See https://gemstonesoup.wordpress.com/2007/05/07/transparent-persistence-for-seaside/ for more info.
>
> Does this answer what you are looking for?
My problem:
when i submit a web seaside request sometime i do:
1) Create a document to be persistence
2) Manage a Printer device tcp/ip session to printer some tickets relative to the document
Now the point 1 is faster
the point 2 is slow, the printer device are slow....
In this situations when i do the point 1 i do:
a) getWriteLock on a persistence object aDocumentLock with:
aDocumentLock getWriteLock
where:
getWriteLock
System writeLock: self
ifDenied: [ self getWriteLock: 1]
ifChanged: [System abortTransaction].
System addToCommitOrAbortReleaseLocksSet: self.
where:
getWriteLock: cnt
System writeLock: self
ifDenied:[ cnt < 1000 ifTrue: [self getWriteLock: cnt +1 ]
ifFalse:[ DTRApplicationEnvError signal: 'Conflitto gestionale: Write Lock Denied' ]]
ifChanged:[System abortTransaction].
System addToCommitOrAbortReleaseLocksSet: self.
( i write this code some time ago. I have to check if still valid )
This manage a conflict for create document by some web request user.
Only one user request at time.
But this aDocumentLock getWriteLock is seaside request transaction long.
And because the point 2 is slow the system is blocked until the point2
a) is terminate with relative printer device ok seaside answer
B) or erase a device tcp/ip connection error with relative web user dialog reporter ( a seaside answer point 4 ).
Then i think to commit the seaside transaction at the end of the point 1
to permit other user to create new document.
This is theoretical situation and i need to do some test to understand the environment behavior......
N.B. Any printer device define a semaphore to manage acces to the device.
The device persistence instance define:
1)accessSema
"Semaphore into OODB "
^ accessSema ifNil:[ accessSema := TransientSemaphore forMutualExclusion ]
2) critical: mutuallyExcludedBlock
^ self accessSema critical: mutuallyExcludedBlock
3) The block 3a and the call 3b to printer the ticket
3a) aBlock:= [itemDbCasse linkModuloTicketGestionale
newOn: dcmModel
dettagli: flagDettagli
onPrinter: aDevice
forCentri: #(#all) ].
3b) self managePrintBlock: aBlock onDevice: aDevice
4) The WAComponent method:
managePrintBlock: aBlock onDevice: aDevice
| flag count loopLimited rsl chiusuraForzata exception |
flag := true.
count := 0.
loopLimited := aDevice loopForDeviceError.
chiusuraForzata := false.
[ flag ] whileTrue:[
count := count+1.
rsl := aDevice critical:[[self doBlockOnPrinter: aBlock]
on: Error do: [:ex | exception := ex. false ]].
rsl ifFalse:[ chiusuraForzata := self masterView jqDialog:
( WADTRPrinterDialogOkErrore openOnException: exception
onModel: nil
close: count >= loopLimited )
title:'Errore'.
chiusuraForzata ifNil:[ chiusuraForzata := true].
chiusuraForzata ifTrue:[ flag := false.]]
ifTrue:[ ^true ]].
^false
5) doBlockOnPrinter: aBlock
" Esegue aBlock intercettando Printer error
( che sono tutti gli errori perchè resignalAs: PrinterTicketError)
Viene richiamato da critical "
| tentativiStampa counterLoop chiusuraForzata delay |
tentativiStampa := 4. "aPrinter loopForDeviceError."
counterLoop := 0.
chiusuraForzata := false.
delay:= 100. " milliseconds "
aBlock on: PrinterTicketError do:[ :ex |
counterLoop := counterLoop + 1.
counterLoop < tentativiStampa
ifTrue:[ (Delay forMilliseconds: delay ) wait]
ifFalse:[ chiusuraForzata :=true].
chiusuraForzata ifTrue:[ ex pass ]
ifFalse:[ ex retry]].
^ true
-----------------------------------------------------------
I write this now and i'm ......
Considerations - suggestions - ideas are welcome.
Thanks,
Dario
> best
> Johan
>
>> On 8 Jun 2017, at 12:38, Trussardi Dario Romano via Glass <glass at lists.gemtalksystems.com> wrote:
>>
>> Ciao,
>>
>> i have seaside application.
>>
>> I need to manage a commit after create some data ( to be commit )
>>
>> but before return answer to the web request.
>>
>> The System commit in the seaside transaction answer a error.
>>
>> I read the https://github.com/GsDevKit/gsApplicationTools/blob/master/docs/gettingStarted.md#table-of-contents
>>
>> But the doBasicTransaction: it's the right solutions?
>>
>> If it is right the doBasicTransaction: is sent to ? in the smalltalk code.
>>
>> http://downloads.gemtalksystems.com/docs/GemStone64/3.1.x/GS64-ProgGuide-3.1.pdf
>> Where i can found information about transaction into seaside applications?
>> Thanks,
>> Dario
>>
>>
>> _______________________________________________
>> Glass mailing list
>> Glass at lists.gemtalksystems.com
>> http://lists.gemtalksystems.com/mailman/listinfo/glass
>
> _______________________________________________
> Glass mailing list
> Glass at lists.gemtalksystems.com
> http://lists.gemtalksystems.com/mailman/listinfo/glass
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.gemtalksystems.com/mailman/private/glass/attachments/20170608/fe3244e5/attachment.html>
More information about the Glass
mailing list