MySQL: Impedire race condition - FOR UPDATE o bloccare in modalità di condivisione?
-
21-08-2019 - |
Domanda
Ecco il mio ordine di transazione desiderata:
- Utente1 selezionare campo, eseguire l'operazione, l'aggiornamento con il nuovo valore.
- Utente2 selezionare campo, eseguire l'operazione, l'aggiornamento con il nuovo valore.
- Utente3 selezionare campo, eseguire l'operazione, l'aggiornamento con il nuovo valore.
Da quello che ho capisco la prima selezionare solo eseguire una scrittura blocco, mentre il secondo eseguire operazioni di lettura e scrittura di blocco.
Sia sembra utilizzabile, ma nel primo caso, quale valore sarà Utente2 leggere? Il valore iniziale prima che gli aggiornamenti Utente1, o il valore dopo gli aggiornamenti Utente1 (che è quello che voglio)?
Sono confuso, dovrei usare SELECT ... FOR UPDATE o Seleziona ... BLOCCO IN MODALITÀ AZIONE?
Soluzione
Probabilmente si desidera utilizzare per l'aggiornamento.
Con "LOCK IN MODALITA 'SHARE" il secondo utente sarà ancora in grado di leggere il valore prima che è stato aggiornato.
Dalla documentazione MySQL:
Se si utilizza FOR UPDATE con un deposito motore che utilizza pagina o riga serrature, righe esaminati dalla query sono scrittura bloccato fino alla fine della transazione corrente. Utilizzando BLOCCO IN SHARE MODE imposta un blocco condiviso che consente altre operazioni di leggere la esaminato righe ma non aggiornare o cancellarli.
Quindi, anche se BLOCCO IN MODALITÀ SHARE impedisce un aggiornamento, se il funzionamento dipende dal valore di lettura, si può finire in uno stato incoerente.