Immagina un percorso in un progetto web MVC che gestisca la modifica di un utente del tuo prodotto. Puoi fare cose come cambiare il loro nome, la loro email, il loro gruppo, i loro ruoli e così via. Questi dati vengono messi in un modulo e inviati al server.
Ora immagina di avere un servizio UserManager per gestire queste azioni. Come posso assicurarmi che la mia rotta sia atomica quando il processo potrebbe fallire dopo un numero arbitrario di azioni?
userManager.SetEmail(userID, newEmail) // passes, no duplicate emails, email ok.
userManager.SetPassword(userID, newPassword) // passes, password validates.
userManager.SetGroup(userID, newGroupID) // FAIL!!! group id is invalid or something.
Le funzioni sopra riportate altererebbero l'e-mail e la password prima di fallire nell'impostazione del gruppo.
Come si può evitare?