MySQL: Impedire race condition - FOR UPDATE o bloccare in modalità di condivisione?

StackOverflow https://stackoverflow.com/questions/856958

  •  21-08-2019
  •  | 
  •  

Domanda

Ecco il mio ordine di transazione desiderata:

  1. Utente1 selezionare campo, eseguire l'operazione, l'aggiornamento con il nuovo valore.
  2. Utente2 selezionare campo, eseguire l'operazione, l'aggiornamento con il nuovo valore.
  3. 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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top