sql >> Databáze >  >> RDS >> PostgreSQL

Zablokování v PostgreSQL při spuštění UPDATE

V PostgreSQL budou řádky při aktualizaci uzamčeny – ve skutečnosti to funguje tak, že každá n-tice (verze řádku) má systémové pole nazvané xmin k označení, která transakce provedla tuto n-tici aktuální (vložením nebo aktualizací) a systémové pole nazvané xmax k označení, které transakce vypršela platnost této n-tice (aktualizací nebo odstraněním). Když přistupujete k datům, kontroluje každou n-tici, aby zjistil, zda je viditelná pro vaši transakci, a to tak, že porovná váš aktivní „snímek“ s těmito hodnotami.

Pokud provádíte UPDATE a n-tice, která odpovídá vašim podmínkám vyhledávání, má xmin, díky kterému bude viditelná pro váš snímek, a xmax aktivní transakce, zablokuje se a čeká na dokončení transakce. Pokud se transakce, která jako první aktualizovala n-tici, vrátí zpět, vaše transakce se probudí a zpracuje řádek; pokud se první transakce potvrdí, vaše transakce se probudí a provede akci v závislosti na aktuální úrovni izolace transakce.

Je zřejmé, že zablokování je výsledkem toho, že k tomu dochází u řádků v různém pořadí. V paměti RAM není žádný zámek na úrovni řádků, který lze získat pro všechny řádky současně, ale pokud jsou řádky aktualizovány ve stejném pořadí, nemůžete mít kruhové zamykání. Bohužel, navrhované IN(1, 2) syntaxe to nezaručuje. Různé relace mohou mít aktivní různé nákladové faktory, úloha „analýza“ na pozadí může změnit statistiky tabulky mezi generováním jednoho plánu a druhého, nebo může používat seqscan a být ovlivněna optimalizací PostgreSQL, která způsobí nový seqscan. připojit se k již probíhajícímu a „zacyklit se“, abyste snížili vstup/výstup disku.

Pokud provedete aktualizace jednu po druhé ve stejném pořadí, v kódu aplikace nebo pomocí kurzoru, budete mít pouze jednoduché blokování, nikoli uváznutí. Obecně však platí, že relační databáze jsou náchylné k selhání serializace a je nejlepší k nim přistupovat prostřednictvím rámce, který je rozpozná na základě SQLSTATE a automaticky zopakuje celou transakci od začátku. V PostgreSQL bude mít selhání serializace vždy SQLSTATE 40001 nebo 40P01.

http://www.postgresql.org/docs/current/interactive/mvcc-intro.html




  1. Výkonnostní překvapení a předpoklady:Libovolné TOP 1

  2. Funkce NLS_UPPER() v Oracle

  3. PostgreSQL UNIX doménové sokety vs TCP sokety

  4. Připojení PolyBase k Salesforce.com