Sobes.tech
Middle

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:

  1. 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í.
  2. 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í.
  3. 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ů).
  4. 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.