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 UPDATErecord 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.