Supponiamo di avere una pagina di visualizzazione in cui gli utenti eseguono azioni in più passaggi, alcune di queste azioni comporterebbero operazioni DB con transazioni (i frammenti sono in pseudo-codice come from):
View 1:
Step 1:
...
Step 2:
...
Call ActionX
Step 3:
...
ActionX: # can be called from different points in the view
...
Begin Transaction
DB ops
End Transaction
Diciamo che vogliamo registrare l'avanzamento dell'utente nella vista (o salvare alcuni stati) in modo persistente nel DB, in modo che se il programma / l'app viene interrotto possiamo ristabilire lo stato all'ultima azione dell'utente all'interno una vista:
View1:
Step 1:
...
Logger.log('view1-step1-done')
Step 2:
...
Call ActionX
Logger.log('view1-step2-done')
Step 3:
...
Logger.log('view1-step3-done')
Ora, idealmente, vorremmo avere la registrazione persistente e le azioni transazionali basate su DB da fare entrambe nella stessa transazione DB, perché non vogliamo creare uno stato incoerente dove viene eseguita un'azione ma non si riflette nello stato del registro o viceversa.
La domanda è: come raggiungere il suddetto obiettivo con il minimo interdipendenza e SOC. Alcuni suggerimenti, ad esempio:
View 1:
Step 1:
...
Step 2:
...
Begin Transaction
Call ActionX # begin/end transaction statements will be removed from ActionX
Logger.log('view1-step3-done')
End Transaction
Step 3:
...
Non piace perché la gestione delle transazioni appartiene naturalmente all'azione stessa.
Oppure, un altro:
View 1:
Step 1:
...
Step 2:
...
Call ActionX (logMsg='view1-step3-done')
Step 3:
...
ActionX (logMsg):
...
Begin Transaction
DB ops
Logger.log(logMsg)
End Transaction
Non ti piace neanche questo. La gestione dei messaggi di registro non appartiene alle azioni.