Jak poprawnie wdrożyć optymistyczne blokowanie w MySQL?
Nasz zespół wydedukował, że musimy zrobić nr 4 poniżej, w przeciwnym razie istnieje ryzyko, że inny wątek może zaktualizować tę samą wersję rekordu, ale chcielibyśmy potwierdzić, że jest to najlepszy sposób.
- Utwórz pole wersji w tabeli, w której chcesz użyć blokowania optymistycznego, np. Nazwa kolumny = „wersja”
- W zaznaczeniach pamiętaj o dołączeniu kolumny wersji i zanotuj wersję
- Po kolejnej aktualizacji rekordu instrukcja aktualizacji powinna wydać „gdzie wersja = X” gdzie X jest wersją otrzymaną w # 2 i ustawić pole wersji podczas tej instrukcji aktualizacji na X + 1
- Wykonaj
SELECT FOR UPDATE
rekord, który zamierzamy zaktualizować, aby serializować, kto może wprowadzić zmiany w rekordzie, który próbujemy zaktualizować.
Aby to wyjaśnić, staramy się, aby dwa wątki, które wybierają ten sam rekord w tym samym oknie czasowym, w którym pobierają tę samą wersję rekordu, nie nadpisywały się nawzajem, gdyby próbowały zaktualizować rekord w tym samym czasie. Uważamy, że jeśli nie zrobimy # 4, istnieje szansa, że jeśli oba wątki wejdą w odpowiednie transakcje w tym samym czasie (ale nie wydały jeszcze swoich aktualizacji), to kiedy przejdą do aktualizacji, drugi wątek, który użyje aktualizacji ... gdzie wersja = X będzie działać na starych danych.
Czy słusznie myślimy, że musimy dokonać tego pesymistycznego blokowania podczas aktualizacji, nawet jeśli korzystamy z pól wersji / blokowania optymistycznego?
SELECT ... FOR UPDATE
czy zamek optymistyczne wersji wiersza, a nie obu. Zobacz szczegóły w odpowiedzi.