Sobes.tech
Middle

Kādi ir transakciju izolācijas līmeņi?

sobes.tech AI

Atbilde no AI

SQL transakciju izolācijas līmeņi nosaka, cik ļoti viena transakcija var redzēt citas transakcijas neapstiprinātos izmaiņas. Tie ir paredzēti, lai novērstu paralēlas piekļuves problēmas: netīru lasījumu, atkārtotu lasījumu un spoku lasījumu.

Ir četri standarta izolācijas līmeņi:

  1. READ UNCOMMITTED (Nepatvirtušu datu lasīšana)
    • Viszemākais līmenis.
    • Transakcija var redzēt citu transakciju neapstiprinātās izmaiņas (atļauj netīru lasījumu).
    • Nesaglabā atkārtotu un spoku lasījumu.
  2. READ COMMITTED (Apstiprinātu datu lasīšana)
    • Novērš netīru lasījumu.
    • Transakcija redz tikai tās izmaiņas, kas ir apstiprinātas pirms vaicājuma sākuma vai tā laikā.
    • Nesaglabā atkārtotu un spoku lasījumu.
  3. REPEATABLE READ (Atkārtots lasījums)
    • Novērš netīru un atkārtotu lasījumu.
    • Ja transakcija vairākas reizes lasa rindu, tā vienmēr redz to pašu vērtību, ja tā pati to neizmaina.
    • Nesaglabā spoku lasījumu (citas transakcijas var pievienot jaunas rindas, kas ir redzamas atkārtotā vaicājumā).
  4. SERIALIZABLE (Sērijizēts režīms)
    • Novērš visas paralēlas piekļuves problēmas: netīru, atkārtotu un spoku lasījumu.
    • Transakcijas tiek izpildītas tā, it kā tās būtu izpildītas secīgi, viena pēc otras.
    • Augstākais līmenis, bet arī lēnākais, jo prasa vairāk bloķēšanas.

Salīdzinošā tabula par problēmām, kuras novērš katrs līmenis:

Izolācijas līmenis Netīrs lasījums Atkārtots lasījums Spoku lasījums
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE

Izolācijas līmeņa izvēle ir atkarīga no lietojumprogrammas datu konsekvences un veiktspējas prasībām:

Python valodā, strādājot ar datu bāzēm (piemēram, sqlite3, PostgreSQL psycopg2, MySQL mysql.connector) — parasti var noteikt ar atbilstošu metodi savienojuma vai kursora līmenī:

sqlite3 piemērs:

# Bibliotēkas imports
import sqlite3

// Savienojuma ar datu bāzi izveide
conn = sqlite3.connect('mydatabase.db', isolation_level='REPEATABLE READ')
// Vietā 'REPEATABLE READ' var norādīt None (analogais — READ UNCOMMITTED), 'DEFERRED', 'IMMEDIATE', 'EXCLUSIVE'

// Kursora piemērs
cursor = conn.cursor()

// Turpmākie soļi...

// Izmaiņu apstiprināšana
conn.commit()

// Savienojuma aizvēršana
conn.close()

psycopg2 piemērs:

// Bibliotēkas imports
import psycopg2
// Izolācijas līmeņu konstantes
from psycopg2.extensions import ISOLATION_LEVEL_READ_COMMITTED, ISOLATION_LEVEL_SERIALIZABLE

// Savienojuma izveide
conn = psycopg2.connect(database="mydatabase", user="myuser", password="mypassword", host="localhost")

// Izolācijas līmeņa iestatīšana
conn.set_isolation_level(ISOLATION_LEVEL_SERIALIZABLE)
// Var izmantot: ISOLATION_LEVEL_READ_UNCOMMITTED, ISOLATION_LEVEL_READ_COMMITTED, ISOLATION_LEVEL_REPEATABLE_READ, ISOLATION_LEVEL_SERIALIZABLE

// Kursora piemērs
cursor = conn.cursor()

// Turpmākie soļi...

// Izmaiņu apstiprināšana
conn.commit()

// Savienojuma aizvēršana
conn.close()

Standarta līmeņi nodrošina līdzsvaru starp konsekvenciju un veiktspēju, bieži tiek izmantoti READ COMMITTED un SERIALIZABLE.