Come si implementa correttamente il blocco ottimistico in MySQL?
Il nostro team ha dedotto che dobbiamo fare il n. 4 di seguito, altrimenti esiste il rischio che un altro thread possa aggiornare la stessa versione del record, ma vorremmo confermare che questo è il modo migliore per farlo.
- Creare un campo versione sulla tabella che si desidera utilizzare il blocco ottimistico, ad esempio nome colonna = "versione"
- Su selezioni, assicurarsi di includere la colonna della versione e prendere nota della versione
- In un successivo aggiornamento del record, l'istruzione update dovrebbe emettere "dove versione = X" dove X è la versione che abbiamo ricevuto in # 2 e impostare il campo della versione durante tale istruzione di aggiornamento su X + 1
- Eseguire un
SELECT FOR UPDATE
record che stiamo per aggiornare in modo da serializzare chi può apportare modifiche al record che stiamo tentando di aggiornare.
Per chiarire, stiamo cercando di impedire a due thread che selezionano lo stesso record nella stessa finestra di tempo in cui prendono la stessa versione del record di sovrascriversi a vicenda se provano ad aggiornare il record allo stesso tempo. Riteniamo che, a meno che non facciamo il n. 4, esiste la possibilità che se entrambi i thread immettono le rispettive transazioni contemporaneamente (ma non hanno ancora emesso i loro aggiornamenti), quando passano all'aggiornamento, il secondo thread che utilizzerà UPDATE ... dove version = X opererà su vecchi dati.
Siamo corretti nel pensare che dobbiamo fare questo blocco pessimistico durante l'aggiornamento anche se stiamo usando i campi versione / blocco ottimistico?
SELECT ... FOR UPDATE
o blocco ottimistico tramite il controllo delle versioni delle righe, non entrambi. Vedi i dettagli nella risposta.