Nasimulujume deadlock.
Nejdříve si vytvoříme tabulku s clusterovaným indexem.
CREATE TABLE tabule( id INT CONSTRAINT pk_tabule PRIMARY KEY IDENTITY(1,1), a INT )
Dále v jednom okně management studia spustíme pár insertů pro naplnění tabulky.
BEGIN TRAN INSERT INTO tabule(a) VALUES(3) INSERT INTO tabule(a) VALUES(2) INSERT INTO tabule(a) VALUES(1)
Transakci nepotvrdíme a proto záznamy zůstanou exkluzivně zamčené.
Ve druhém okně uděláme další insert.
BEGIN TRAN INSERT INTO tabule(a) VALUES(4)
Zase transakci nepotvrdíme a záznam bude tudíž exkluzivně zamčený.
V prvním okně se třemi inserty ve stále běžící transakci se pokusíme smazat záznamy vyhovující podmínce.
DELETE FROM tabule WHERE a = 3
Protože na sloupci „a“ nemáme index, server se pokusí přečíst všechny záznamy (clustered index scan) a na každém záznamu se pokusí udělat UPDLOCK. Příkaz nedoběhne, protože bude čekat na uvolnění exkluzivního zámku na jednom vloženém záznamu z druhého okna.
Pokud se i ve druhém okně pokusíme mazat, pak dojde k deadlocku, protože v této situaci už ani jeden proces nemůže zámky uvolnit. Čekají na sebe navzájem = deadlock.
BEGIN TRAN DELETE FROM tabule WHERE a = 4
Tyto problémy je možné vyřešit použitím vhodného indexu. Pokud vytvoříme index nad sloupcem „a“, pak při mazání záznamů s podmínkou proti sloupci „a“ server použije procházení indexu (index seek). Podaří se nám tedy smazat nezamčené záznamy, zamčené záznamy samozřejmě smazat nelze (vložené záznamy budou zamčené exkluzivně i na indexu a při mazání se nepovede vytvořit UPDLOCK zámek).
V obou transakcích provedeme ROLLBACK a vytvoříme index. Pak se pokusíme vkládat a mazat záznamy dle předchozího scénáře. Obojí se povede.
CREATE INDEX ix_tabule_a ON tabule(a)
Vhodným indexem tedy můžeme řešit problémy se zamykáním a deadlocky.