Snažil jsem se pochopit rozdíl mezi těmito dvěma. Zdokumentuji, co jsem našel, v naději, že to bude užitečné pro další osobu.
Oba LOCK IN SHARE MODE
a FOR UPDATE
Ujistěte se, že žádná jiná transakce nemůže aktualizovat vybrané řádky. Rozdíl mezi nimi je v tom, jak zacházejí se zámky při čtení dat.
LOCK IN SHARE MODE
nezabrání jiné transakci ve čtení stejného řádku, který byl uzamčen.
FOR UPDATE
zabraňuje dalším uzamykatelným čtením stejného řádku (nezamknutá čtení mohou stále číst tento řádek; LOCK IN SHARE MODE
a FOR UPDATE
zamykají čtení).
To je důležité v případech, jako je aktualizace počítadel, kdy čtete hodnotu v jednom příkazu a aktualizujete hodnotu v jiném. Zde pomocí LOCK IN SHARE MODE
umožní 2 transakcím přečíst stejnou počáteční hodnotu. Pokud se tedy počítadlo zvýšilo o 1 oběma transakcemi, konečný počet se může zvýšit pouze o 1 – protože obě transakce zpočátku četly stejnou hodnotu.
Pomocí FOR UPDATE
by zablokoval 2. transakci od načtení hodnoty do provedení první. Tím zajistíte, že se počítadlo zvýší o 2.