Per quanto a mia conoscenza, non v'è alcuna soluzione generale al problema.
La radice del problema è che l'utente può recuperare i dati e fissarli sullo schermo per un lungo periodo di tempo prima di effettuare un aggiornamento e un salvataggio.
So di tre approcci di base:
Quando l'utente legge il database, bloccare il record e non rilasciano fino a quando l'utente salva eventuali aggiornamenti. In pratica, questo è incredibilmente poco pratico. Cosa succede se l'utente visualizza uno schermo e poi va a pranzo senza salvare? O va a casa per il giorno? O è così frustrato nel tentativo di aggiornare questo stupido disco che lascia e non torna mai più?
Esprimi i tuoi aggiornamenti come delta anziché destinazioni. Per fare un esempio classico, supponiamo di avere un sistema che registra le scorte nell'inventario. Ogni volta che c'è una vendita, devi sottrarre 1 (o più) dal conteggio delle scorte.
Quindi dire che la quantità attuale a disposizione è 10. L'utente A crea una vendita. Quantità corrente = 10. L'utente B crea una vendita. Ottiene anche la quantità corrente = 10. L'utente A inserisce due unità vendute. Nuova quantità = 10 - 2 = 8. Salva. L'utente B entra in una unità venduta. Nuova quantità = 10 (il valore che ha caricato) - 1 = 9. Salva. Chiaramente, qualcosa è andato storto.
Soluzione: invece di scrivere "aggiornamento inventario quantità set = 9 dove itemid = 12345", scrivere "aggiornamento inventario quantità impostata = quantità-1 dove itemid = 12345". Quindi lascia che il database accoda gli aggiornamenti. Questo è molto diverso dalla strategia numero 1, in quanto il database deve solo bloccare il record per un tempo sufficiente a leggerlo, effettuare l'aggiornamento e scriverlo. Non deve aspettare mentre qualcuno fissa lo schermo.
Naturalmente, questo è utilizzabile solo per le modifiche che possono essere espresse come delta. Se, per esempio, stai aggiornando il numero di telefono del cliente, non funzionerà. (Come, il vecchio numero è 555-1234. L'utente A dice di cambiarlo in 555-1235. Questo è un cambiamento di +1 L'utente B dice di cambiarlo in 555-1243. Questo è un cambiamento di +9. +10, il nuovo numero del cliente è 555-1244. :-)) Ma in casi del genere, "l'ultimo utente che fa clic sul tasto Invio vince" è probabilmente il meglio che puoi fare comunque.
- In fase di aggiornamento, verificare che i campi pertinenti nel database corrispondano al proprio valore "da". Ad esempio, supponiamo che lavori per uno studio legale per negoziare contratti per i tuoi clienti. Hai una schermata in cui un utente può inserire note sulle negoziazioni. L'utente A visualizza un record del contratto. L'utente B mostra lo stesso record di contratto. L'utente A entra che ha appena parlato con l'altra parte al telefono e sono graditi ai termini proposti. L'utente B, che ha anche provato a chiamare l'altra parte, fa in modo che non stia rispondendo alle telefonate e sospetta che stiano facendo un stonewalling. Un utente fa clic su Salva. Vogliamo che i commenti dell'utente B sovrascrivano l'utente A? Probabilmente no. Invece mostriamo un messaggio che indica che le note sono state cambiate da quando ha letto il record e gli ha permesso di vedere il nuovo valore prima di decidere se procedere con il salvataggio, interrompere o inserire qualcosa di diverso.
[Nota: il forum è rinumerazione automaticamente i miei elenchi numerati. Non sono sicuro di come ignorarlo.]
Grazie. Questo funziona bene per la variazione 1. Ma, qual è il solito modo di affrontare questo in una situazione in cui non si hanno transazioni? per esempio.MyISAM di MySQL – Ming
Per chiarire, immagino che un sacco di software per forum avrebbe dovuto trattare questo tipo di problema. Eppure, vedo che molti di loro usano MyISAM, che non ha transazioni. Qual è la loro risoluzione a questo? – Ming
non puoi gestirlo in modo affidabile. Il software del forum si basa principalmente su inserti e raramente su modifiche simultanee, quindi non causa molti problemi – Bozho