Jaké úrovně izolace transakcí existují?
sobes.tech AI
Odpověď od AI
Úrovně izolace transakcí v SQL určují, do jaké míry může jedna transakce vidět neuložené změny provedené jinými transakcemi. Jsou navrženy tak, aby zabránily problémům s paralelním přístupem: špinavé čtení, nevratné čtení a fantomové čtení.
Existují čtyři standardní úrovně izolace:
- READ UNCOMMITTED (Čtení neuložených dat)
- Nejnižší úroveň.
- Transakce může vidět neuložené změny jiných transakcí (umožňuje špinavé čtení).
- Nezabraňuje nevratnému čtení a fantomovému čtení.
- READ COMMITTED (Čtení potvrzených dat)
- Zabraňuje špinavému čtení. Transakce vidí pouze změny, které byly potvrzeny před začátkem nebo během dotazu.
- Umožňuje nevratné čtení a fantomové čtení.
- REPEATABLE READ (Opakovatelné čtení)
- Zabraňuje špinavému a nevratnému čtení. Pokud transakce čte řádek vícekrát, vždy vidí stejnou hodnotu, pokud sama nezměnila ji.
- Umožňuje fantomové čtení (jiné transakce mohou vkládat nové řádky, které jsou viditelné při opakovaném provádění rozsahových dotazů).
- SERIALIZABLE (Serializovatelné)
- Odstraňuje všechny problémy s paralelním přístupem: špinavé čtení, nevratné čtení a fantomové čtení.
- Transakce jsou prováděny tak, jako by byly prováděny sekvenčně, jedna po druhé.
- Nejvyšší úroveň, ale i nejpomalejší, protože vyžaduje více zámků.
Porovnávací tabulka problémů, kterým se předchází na každé úrovni:
| Úroveň izolace | Špinavé čtení | Nevratné čtení | Fantomové čtení |
|---|---|---|---|
| READ UNCOMMITTED | Ne | Ne | Ne |
| READ COMMITTED | Ano | Ne | Ne |
| REPEATABLE READ | Ano | Ano | Ne |
| SERIALIZABLE | Ano | Ano | Ano |
Výběr úrovně izolace závisí na požadavcích aplikace na konzistenci dat a výkon. Vyšší úrovně zajišťují větší integritu, ale mohou snížit paralelismus.
V Pythonu, při práci s databázemi (například přes sqlite3, knihovny pro PostgreSQL psycopg2, pro MySQL mysql.connector), lze úroveň izolace obvykle nastavit prostřednictvím odpovídající metody spojení nebo kurzoru.
Příklad nastavení úrovně izolace v sqlite3:
# Import knihovny
import sqlite3
# Připojení k databázi
conn = sqlite3.connect('mydatabase.db', isolation_level='REPEATABLE READ')
# Místo 'REPEATABLE READ' lze uvést None (ekvivalentní s READ UNCOMMITTED), 'DEFERRED', 'IMMEDIATE', 'EXCLUSIVE'
# Příklad použití kurzoru
cursor = conn.cursor()
# Další práce s databází...
# Potvrzení změn
conn.commit()
# Zavření spojení
conn.close()
Příklad nastavení úrovně izolace v psycopg2:
# Import knihovny
import psycopg2
# Import konstant úrovní izolace
from psycopg2.extensions import ISOLATION_LEVEL_READ_COMMITTED, ISOLATION_LEVEL_SERIALIZABLE
# Připojení k databázi
conn = psycopg2.connect(database="mydatabase", user="myuser", password="mypassword", host="localhost")
# Nastavení úrovně izolace
conn.set_isolation_level(ISOLATION_LEVEL_SERIALIZABLE)
# Může být použito ISOLATION_LEVEL_READ_UNCOMMITTED, ISOLATION_LEVEL_READ_COMMITTED, ISOLATION_LEVEL_REPEATABLE_READ, ISOLATION_LEVEL_SERIALIZABLE
# Příklad použití kurzoru
cursor = conn.cursor()
# Další práce s databází...
# Potvrzení změn
conn.commit()
# Zavření spojení
conn.close()
Standardní úrovně izolace zajišťují rovnováhu mezi konzistencí a výkonem. V praxi jsou nejčastěji používány READ COMMITTED a SERIALIZABLE.