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í vyřídit zámek na stejných datech, zámek se udělí, 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 povolené. 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. Vyřazení tabulky vyžaduje zámek ACCESS EXCLUSIVE, který by se v tomto scénáři neudělil.

Zámky na úrovni tabulky

Zámky na úrovni tabulky získávají zámky v celé tabulce, i když mají v názvu řádek. 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Á SLOŽKA ŘÁDKŮ SELECT FOR UPDATE and SELECT FOR SHARE commands
ŘÁDEK S VÝHRADNÍM Příkazy UPDATE, DELETE a INSERT
SHARE UPDATE EXCLUSIVE ANALYZE, CREATE INDEX CONCURRENTLY, CREATE STATISTICS, COMMENT ON, REINDEX CONCURRENTLY commands, some ALTER INDEX and ALTER TABLE commands, and VACUUM (not FULL)
SDÍLET Příkaz CREATE INDEX (ne CONCURRENTLY)
SDÍLET ŘÁDEK S VÝHRADNÍM PŘÍKAZ CREATE TRIGGER a některé příkazy ALTER TABLE
EXKLUZIVNÍ PŘÍKAZ AKTUALIZOVAT MATERIALIZOVANÉ ZOBRAZENÍ SOUBĚŽNĚ
VÝHRADNÍ PŘÍSTUP PŘÍKAZY DROP TABLE, REINDEX, TRUNCATE, CLUSTER, REFRESH MATERIALIZED VIEW (ne 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í, co zámky blokují získání dalších zámků:

-- Existující SDÍLENÁ SLOŽKA ACCESSU Existující SDÍLENÁ SLOŽKA ŘÁDKŮ Existující ŘÁDEK EXCLUSIVE Existující AKTUALIZACE SDÍLENÉ SLOŽKY S VÝHRADNÍM VYUŽITÍM Existující sdílená složka EXISTUJÍCÍ SEZNAM EXCL ŘÁDKU SDÍLENÉ SLOŽKY Existující EXCLUSIVE Stávající PŘÍSTUP EXCLUSIVE
Požadovaná přístupová sdílená složka Blokované
Požadovaná sdílená složka řádků Blokováno Blokováno
Požadovaný řádek EXCLUSIVE Blokováno Blokováno Blokováno Blokováno
Požadovaná aktualizace SHARE EXCLUSIVE Blokováno Blokováno Blokováno Blokováno Blokováno
Požadovaná sdílená složka Blokováno Blokováno Blokováno Blokováno Blokováno
Požadovaný ŘÁDEK SDÍLENÍ S VÝHRADNÍM Blokováno Blokováno Blokováno Blokováno Blokováno Blokováno
Požadováno EXCLUSIVE Blokováno Blokováno Blokováno Blokováno Blokováno Blokováno Blokováno
Požadovaný přístup EXCLUSIVE Blokováno Blokováno Blokováno Blokováno Blokováno Blokováno Blokováno Blokováno

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ání a vyřazení 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í SDÍLENÁ SLOŽKA KLÍČŮ Existující PRO SDÍLENÍ Stávající AKTUALIZACE KLÍČE Existující AKTUALIZACE
Požadováno PRO SDÍLENOU SLOŽKU KLÍČŮ Blokované
Požadováno pro sdílení Blokováno Blokováno
Požadováno BEZ AKTUALIZACE KLÍČE Blokováno Blokováno Blokováno
Požadováno PRO AKTUALIZACI Blokováno Blokováno Blokováno Blokováno

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. Pří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;