20 Duben 2010
kategorie SQL, napsal pavoocek, 20.04.2010

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



Napsat komentář
Jméno: 
Email: 
URL: 
Komentář: