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

Izolace transakcí v PostgreSQL

PostgreSQL přichází se solidními, časem prověřenými funkcemi, které vám umožňují přesně definovat, co se má stát, když se několik klientů pokusí aktualizovat stejná data současně. Jedním z nich je úroveň izolace transakcí.

Čtěte dále a zjistěte více o tom, jak funguje izolace transakcí v PostgreSQL.

Úroveň transakcí a izolace

Transakce jsou základním způsobem, jak mutovat data v RDBMS. Moderní RDBMS umožňují souběžný běh více než jedné transakce a v důsledku toho přicházejí s řadou nástrojů – některé standardní, některé specifické pro RDBMS – pro vývojáře aplikací, aby určili, jak by jejich transakce měly nebo neměly interagovat s jinými transakcemi.

Dva takové nástroje jsou úrovně izolace transakcí a pesimistické zámky. Přestože jsou nezbytné pro integritu a výkon dat, jejich pochopení a použití bohužel není intuitivní.

Úroveň izolace transakce v PostgreSQL může být jedna z:

  • Přečíst odsouhlaseno
  • Opakovatelné čtení
  • Serializovatelný

Každá transakce má při vytvoření nastavenou úroveň izolace na jednu z nich. Výchozí úroveň je „přečtení potvrzeno“.

Všimněte si, že standard SQL také definuje „read uncommitted“, což není v Postgres podporováno. Musíte použít nejbližší vyšší úroveň „přečtení potvrzeno“.

Podívejme se, co tyto úrovně znamenají.

Čtení potvrzeno

Co se stane, když jedna (nedokončená) transakce vloží řádky do tabulky a druhá (rovněž nedokončená) transakce se pokusí přečíst všechny řádky v tabulce? Pokud druhá transakce vidí řádky vložené první, pak se to nazývá nečisté čtení – protože první transakce se může vrátit zpět a druhá transakce by přečetla „fiktivní“ řádky, které nikdy neexistovaly.

Přečtení potvrzeno úroveň izolace zaručuje, že ke špinavým čtením nikdy nedojde. Zde je příklad:

Jak vidíte, druhá transakce nedokázala přečíst data první transakce, která dosud nebyla potvrzena. V PostgreSQL není možné snížit úroveň izolace pod tuto úroveň, aby bylo povoleno nečisté čtení.

Opakovatelné čtení

Dalším problémem je neopakovatelné čtení. K tomu dochází, když atransaction čte řádek a pak jej čte znovu o něco později, ale dostane jiný výsledek – protože řádek byl mezitím aktualizován jinou transakcí. Čtení se stalo neopakovatelné , jak ukazuje tento příklad:

Chcete-li tento problém vyřešit, nastavte úroveň izolace transakce na „repeatableread“. PostgreSQL pak zajistí, že druhé (nebo jakékoli) čtení také vrátí stejný výsledek jako první čtení. Zde je stejný scénář na úrovni upgradované izolace:

Všimněte si, že úroveň izolace byla zadána spolu s příkazem BEGIN. Je také možné zadat to na úrovni připojení (jako connectionparameter), jako konfigurační parametr (default_transaction_isolation )a pomocí příkazu SET TRANSACTION.

Serializovatelné

Další úroveň izolace řeší problém ztracených aktualizací . Aktualizace provedené v jedné transakci mohou být „ztraceny“ nebo přepsány jinou transakcí, která náhodou běží souběžně, jak je znázorněno zde:

Zde blokuje UPDATE druhé transakce, protože PostgreSQL umístí zámek, aby zabránil další aktualizaci, dokud nebude dokončena první transakce. Změna první transakce je však ztracena, protože druhá „přepsala“ řádek.

Pokud tento druh chování není přijatelný, můžete upgradovat úroveň izolace na serializovatelnou:

Na této úrovni se potvrzení druhé transakce nezdaří. Akce druhé transakce byly založeny na skutečnostech, které byly v době, kdy se měla spáchat, staly neplatnými.

Přestože serializace poskytuje nejvyšší úroveň bezpečnosti, znamená to také, že aplikace musí detekovat taková selhání potvrzení a opakovat celou transakci.


  1. Použijte mysqldump k zálohování MySQL nebo MariaDB

  2. Potřebujete sloupec datetime na serveru SQL Server, který se automaticky aktualizuje při změně záznamu

  3. Jak vrátím pole jsonb a pole objektů z mých dat?

  4. Brána PL/SQL v R11i