Опитвах се да разбера разликата между двете. Ще документирам това, което намерих с надеждата, че ще бъде полезно за следващия човек.
И двете LOCK IN SHARE MODE
и FOR UPDATE
уверете се, че никоя друга транзакция не може да актуализира избраните редове. Разликата между двете е в начина, по който третират заключванията, докато четат данни.
LOCK IN SHARE MODE
не пречи на друга транзакция да чете същия ред, който е бил заключен.
FOR UPDATE
предотвратява други заключващи четения на същия ред (незаключващите четения все още могат да четат този ред; LOCK IN SHARE MODE
и FOR UPDATE
са заключващи четения).
Това има значение в случаи като актуализиране на броячи, когато четете стойност в 1 оператор и актуализирате стойността в друг. Тук се използва LOCK IN SHARE MODE
ще позволи на 2 транзакции да прочетат една и съща първоначална стойност. Така че, ако броячът е увеличен с 1 от двете транзакции, крайният брой може да се увеличи само с 1 - тъй като и двете транзакции първоначално четат една и съща стойност.
Използване на FOR UPDATE
щеше да заключи втората транзакция от четене на стойността до приключване на първата. Това ще гарантира, че броячът се увеличава с 2.