Principy uzamykání

Dokončeno

Řízení souběžnosti s více verzemi (MVCC) poskytuje odpovídající nastavení souběžnosti pro většinu scénářů. Pokud však aplikace vyžaduje konkrétní zámky, které řídí přesně to, které řádky jsou ovlivněny a s konkrétní úrovní uzamčení, explicitní režimy uzamčení umožňují tento jemně odstupňovaný ovládací prvek.

Ve službě Azure Database for PostgreSQL existují tři typy explicitního zámku, zámků na úrovni tabulky, zámků na úrovni řádků a zámků na úrovni stránky. Počáteční transakce požádá o zámek a v případě přijetí se požadovaný zámek stane existujícím zámkem. Pokud se jiná transakce pokusí zamknout stejná data, zámek je povolen, pokud není v konfliktu s původní transakcí.

Například dvě transakce mohou dotazovat stejná data najednou pomocí příkazu SELECT. Tyto požadavky by používaly zámek „ACCESS SHARE“ a oba by byly povoleny. V jiném scénáři se jedna transakce dotazuje na data příkazem SELECT a zámkem ACCESS SHARE, ale současně se jiná transakce pokusí odstranit stejnou tabulku. Odstranění tabulky vyžaduje zamknutí typu ACCESS EXCLUSIVE, které by v tomto scénáři nebylo uděleno.

Zámky na úrovni tabulky

Zámky na úrovni tabulky získávají zámky na celé tabulce, i když mají ROW v jejich názvu. Uzamčení celé tabulky může být vyžadováno, pokud se samotná tabulka upravuje, nebo může být efektivnější než vyřazení mnoha zámků na úrovni řádků.

Ve službě Azure Database for PostgreSQL existuje osm typů zámků na úrovni tabulky a příkazy SQL, které získávají tyto typy zámků:

Režim uzamčení Získal(a)
PŘÍSTUP KE SDÍLENÉ SLOŽCE Select – příkaz
SDÍLENÍ ŘÁDKU SELECT FOR UPDATE a SELECT FOR SHARE příkazy
EXKLUZIVNÍ ŘÁDEK Příkazy UPDATE, DELETE a INSERT
AKTUALIZACE SDÍLENÍ EXKLUZIVNĚ ANALYZE, CREATE INDEX CONCURRENTLY, CREATE STATISTICS, COMMENT ON, REINDEX CONCURRENTLY příkazy, některé ALTER INDEX a ALTER TABLE příkazy, a VACUUM (nikoli FULL)
SDÍLET Příkaz CREATE INDEX (nikoliv CONCURRENTLY)
VÝHRADNÍ SDÍLENÍ ŘÁDKU PŘÍKAZ CREATE TRIGGER a některé příkazy ALTER TABLE
VÝHRADNÍ PŘÍKAZ AKTUALIZOVAT MATERIALIZOVANÉ ZOBRAZENÍ SOUBĚŽNĚ
VÝHRADNÍ PŘÍSTUP PŘÍKAZY DROP TABLE, REINDEX, TRUNCATE, CLUSTER, REFRESH MATERIALIZED VIEW (nikoliv SOUBĚŽNĚ), většina příkazů ALTER INDEX a ALTER TABLE a VACUUM FULL

Každý typ existujícího zámku blokuje získání dalších požadovaných zámků. Následující tabulka uvádí, jaké zámky brání získání dalších zámků:

-- Existující SDÍLENÝ PŘÍSTUP Existující SDÍLENÍ ŘÁDKU Existující ŘÁDEK EXCLUSIVE Existující aktualizace sdíleného zámku s výhradním přístupem Existující sdílení EXISTUJÍCÍ SDÍLENÝ ŘÁDEK EXLUZIVNĚ Existující EXCLUSIVE Stávající PŘÍSTUP EXKLUZIVNÍ
Požadované sdílení přístupu Blokované
Požadované sdílení řádku Blokované Blokované
Požadováno výhradní právo pro řádek Blokované Blokované Blokované Blokované
Požadovaná aktualizace SHARE EXCLUSIVE Blokované Blokované Blokované Blokované Blokované
Požadované sdílení Blokované Blokované Blokované Blokované Blokované
Požadovaný ŘÁDEK SDÍLENÍ S VÝHRADNÍM Blokované Blokované Blokované Blokované Blokované Blokované
Požadováno EXKLUZIVNÍ Blokované Blokované Blokované Blokované Blokované Blokované Blokované
Požadovaný přístup VÝHRADNÝ Blokované Blokované Blokované Blokované Blokované Blokované Blokované Blokované

Zámky na úrovni řádků

Zámky na úrovni řádků jsou podrobnější a ovlivňují pouze jinou transakci, která přistupuje ke stejnému řádku. Tento typ zámku zlepšuje souběžnost, ale získávání a uvolňování mnoha zámků negativně ovlivňuje výkon. Zámky na úrovni řádků se automaticky získávají službou PostgreSQL a nepoužijí se ručně.

Ve službě Azure Database for PostgreSQL existují čtyři typy zámků na úrovni řádků a jsou získány v závislosti na tom, které jiné typy zámků je potřeba blokovat:

-- Existující PRO SDÍLENÍ KLÍČE Určeno ke sdílení Bez aktualizace klíče Existující PRO AKTUALIZACI
Požadováno PRO SDÍLENÍ KLÍČE Blokované
Požadováno pro sdílení Blokované Blokované
Požadováno pro uzamčení bez aktualizace klíče Blokované Blokované Blokované
Požadováno PRO AKTUALIZACI Blokované Blokované Blokované Blokované

Zámky na úrovni stránky

Zámky na úrovni stránky ovlivňují stránku dat, která se obvykle skládá z více řádků. I když procesy PostgreSQL používají zámky na úrovni stránky, vývojáři aplikací obvykle nevyžadují tento typ zámku.

Ruční použití zámků a zobrazení aktuálních zámků

Pokud chcete zámek na úrovni tabulky použít ručně, můžete použít příkaz LOCK s požadovaným režimem uzamčení. Příkaz LOCK musí být v rámci transakce a zámky jsou uvolněny po dokončení transakce. Například:

BEGIN TRANSACTION;
LOCK TABLE humanresources.department IN ROW EXCLUSIVE MODE;
COMMIT;

Chcete-li zobrazit zámky, které jsou aktuálně uloženy v databázi, použijte pg_locks. Pokud chcete například zobrazit všechny aktuální zámky, použijte následující příkaz:

SELECT * FROM pg_locks;