Próbowałem zrozumieć różnicę między nimi. Udokumentuję to, co znalazłem w nadziei, że przyda się to następnej osobie.
Oba LOCK IN SHARE MODE
i FOR UPDATE
upewnij się, że żadna inna transakcja nie może zaktualizować wybranych wierszy. Różnica między nimi polega na tym, jak traktują blokady podczas odczytu danych.
LOCK IN SHARE MODE
nie uniemożliwia innej transakcji odczytu tego samego wiersza, który został zablokowany.
FOR UPDATE
zapobiega innym blokującym odczytom tego samego wiersza (odczyty nieblokujące mogą nadal czytać ten wiersz; LOCK IN SHARE MODE
i FOR UPDATE
blokują odczyty).
Ma to znaczenie w przypadkach, takich jak aktualizacja liczników, gdzie odczytujesz wartość w jednej instrukcji i aktualizujesz wartość w innej. Tutaj za pomocą LOCK IN SHARE MODE
pozwoli 2 transakcjom odczytać tę samą wartość początkową. Więc jeśli licznik został zwiększony o 1 przez obie transakcje, końcowy licznik może wzrosnąć tylko o 1 - ponieważ obie transakcje początkowo odczytują tę samą wartość.
Używanie FOR UPDATE
zablokowałoby drugą transakcję przed odczytaniem wartości, dopóki pierwsza nie zostanie wykonana. Zapewni to zwiększenie licznika o 2.