MS SQL – problém s hintem ROWLOCK u UPDATE

O zamykání záznamů v SQL by se dala napsat samostatná kniha, já se však nyní podělím o drobnou (ale důležitou) zkušenost se zamykáním při volání UPDATE. V případě, že se jedná o update jednoho řádku (zejména podle jedinečného primárního klíče) je více než vhodné podsunout SQL serveru pomocí HINTu použití zámku na úrovni záznamu (záznamů). Takže updatovací dotaz může vypadat nějak takto:

UPDATE table WITH (ROWLOCK)
SET status=0,description='OK'
WHERE id=123


Avšak v případě, kdy jsou updatovaná pole tabulky (v našem případě status a description) součástí jednoho nebo více indexů se zakázaným ROWLOCK, pak dojde k této chybě:
Cannot use ROW granularity hint on table XY, locking at the specified granularity is inhibited.
Řešení je poměrně jednoduché – stačí na urovni indexu (indexů), které indexují updatovanou položku, povolit ROWLOCK a případně i PAGELOCK. Pokud tak neučiníte, nelze používat zámky na úrovni záznamů, případně stránek a dochází zbytečně k zamykání celé tabuky a tím k mnohým problémům nejen s DEADLOCKy.
Nastavení ROWLOCKů a PAGELOCKů je např. ve vlastnostech indexu:
mssql-row-and-page-locks-at

Štítky: , , , , , , ,

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

*