Prendi in considerazione un sito di e-commerce, dove Alice e Bob stanno entrambi modificando le schede dei prodotti. Alice sta migliorando le descrizioni, mentre Bob sta aggiornando i prezzi. Iniziano a modificare il widget Acme Wonder contemporaneamente. Bob finisce per primo e salva il prodotto con il nuovo prezzo. Alice impiega un po 'più di tempo per aggiornare la descrizione e, quando termina, salva il prodotto con la sua nuova descrizione. Sfortunatamente, sovrascrive anche il prezzo con il vecchio prezzo, che non era previsto.
Nella mia esperienza, questi problemi sono estremamente comuni nelle app Web. Alcuni software (ad es. Software wiki) hanno una protezione contro questo - di solito il secondo salvataggio fallisce con "la pagina è stata aggiornata durante la modifica". Ma la maggior parte dei siti Web non ha questa protezione.
Vale la pena notare che i metodi del controller sono di per sé thread-safe. Di solito usano transazioni di database, che le rendono sicure nel senso che se Alice e Bob provano a salvare nello stesso preciso istante, non causeranno corruzione. Le condizioni di gara derivano da Alice o Bob con dati non aggiornati nel loro browser.
Come possiamo prevenire tali condizioni di gara? In particolare, vorrei sapere:
- Quali tecniche possono essere utilizzate? ad es. monitoraggio dell'ora dell'ultima modifica. Quali sono i pro ed i contro di ognuno.
- Che cos'è un'esperienza utente utile?
- In quali framework è integrata questa protezione?