Ho un'entità che ha una proprietà balance
in dollari. Ogni volta che si verifica un evento che fa cambiare il saldo, come un debito, all'interno della stessa transazione, il balance
deve essere decrementato dell'importo del debito (come una sorta di valore "di riepilogo", in modo che una query DB abbia vinto " t devono essere eseguiti per recuperare il bilancia ogni volta.)
Ci sono due modi per farlo:
- Posso utilizzare la funzionalità
lock for update
nel DB per impedire letture dal valorebalance
fino al termine dell'elaborazione. In questo modo, posso modificare il saldo nella mia entità, ad esempio$user->lowerBalance(1000)
, e quindi eseguire il commit del valore in un repository. Lo svantaggio è che questa può essere un'applicazione ad alto carico e non voglio impedire a nessuno di leggere il valore. - L'altra opzione è utilizzare la funzione di decremento del database:
update users set balance = balance - 1000
. Ciò garantirà che, anche se due aggiornamenti vengono effettuati quasi alla stessa ora, il valore sarà sempre corretto. Il valore effettivo non verrà impostato o conosciuto nel livello del dominio finché non viene interrogato.
Voglio usare l'opzione 2, ma come faccio a modellarla? Un modo è quello di chiamare il metodo del repository all'interno del metodo lowerBalance()
nella classe Entity, ma poi ho accoppiato l'entità dominio al livello infrastruttura. Inoltre, se voglio l'ultimo valore, dovrei assicurarmi che il repository recuperi l'entità. Forse è ok in questo caso, poiché il libro blu dice che i livelli possono dipendere dagli strati sottostanti.
Qualche suggerimento su come può essere strutturato?