Isolatie
Veeg om het menu te tonen
In de context van databases verwijst isolatie naar het vermogen van een databasesysteem om de zichtbaarheid van wijzigingen door gelijktijdige transacties te beheersen. Het zorgt ervoor dat transacties onafhankelijk van elkaar functioneren, waardoor onderlinge beïnvloeding wordt voorkomen en de gegevensintegriteit behouden blijft.
Er zijn 4 isolatieniveaus in SQL:
- read uncommitted;
- read committed;
- repeatable read;
- serializable.
Read uncommitted
Dit is het laagste isolatieniveau waarbij transacties wijzigingen kunnen zien die door andere transacties zijn aangebracht, zelfs voordat deze zijn vastgelegd. Dit niveau staat vuile lezingen toe, wat betekent dat een transactie gegevens kan lezen die door een andere transactie zijn gewijzigd maar nog niet zijn vastgelegd.
Vuile lezingen
Een vuile lezing doet zich voor wanneer een transactie gegevens leest die door een andere transactie zijn gewijzigd maar nog niet zijn vastgelegd.
Stel bijvoorbeeld dat er twee banktransacties gelijktijdig plaatsvinden: Transactie A controleert je rekeningbalans terwijl Transactie B geld op je rekening stort. Als Transactie A het verhoogde saldo ziet voordat Transactie B is afgerond, is er sprake van een vuile lezing, omdat het nieuwe saldo kan worden teruggedraaid als Transactie B mislukt.
Implementatie
Om het isolatieniveau voor de transactie te specificeren, kunnen we het volgende commando in onze query gebruiken:
-- Start transaction
BEGIN;
-- Set the isolation level for the transaction
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
/* Transaction query */
COMMIT;
-
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;: Deze instructie wijzigt het isolatieniveau voor de huidige transactie naar "Read Uncommitted", waardoor de transactie mogelijk gegevens kan lezen die door andere niet-gecommitteerde transacties zijn gewijzigd; -
dit commando moet alleen binnen het transactiebereik worden gebruikt! Anders heeft het geen effect en wordt het standaard isolatieniveau gebruikt.
We kunnen het huidige isolatieniveau ook controleren met het volgende commando:
SHOW TRANSACTION ISOLATION LEVEL;
Read committed
Het Read Committed isolatieniveau zorgt ervoor dat een transactie alleen gegevens ziet die zijn gecommitteerd door andere transacties.
Dit betekent dat niet-gecommitteerde wijzigingen door andere transacties niet zichtbaar zijn voor transacties die onder Read Committed isolatie werken.
Hierdoor worden vuile lezingen voorkomen doordat een transactie alleen gecommitteerde gegevens kan lezen. Dit transactieniveau heeft echter problemen met niet-herhaalbare lezingen.
Niet-herhaalbare lezingen
Een niet-herhaalbare lezing doet zich voor wanneer een transactie dezelfde rij meerdere keren binnen dezelfde transactie leest, maar de opgehaalde gegevens veranderen tussen de lezingen door aanpassingen van andere transacties. Deze inconsistentie kan leiden tot onverwacht gedrag en foutieve resultaten.
Stel bijvoorbeeld dat een transactie het saldo van een klant twee keer opvraagt. De eerste query geeft $1000 terug, maar voordat de transactie is voltooid, stort een andere transactie $500 op de rekening. Wanneer de tweede query wordt uitgevoerd, toont deze $1500, wat leidt tot een niet-herhaalbare lezing, waarbij dezelfde gegevens verschillend worden gelezen binnen één transactie door wijzigingen van een andere transactie.
Het "Read committed" isolatieniveau staat niet-herhaalbare lezingen toe omdat het de leesoperatie vergrendelt op waarden die zich in niet-gecommitteerde transacties bevinden, maar de schrijfoperatie niet vergrendelt.
Hierdoor kunnen we nieuwe gegevens schrijven naar de rij die op dat moment door een andere transactie wordt gelezen.
Verloren update
Door het ontbreken van de schrijflock is er nog een probleem met het read committed isolatieniveau - verloren updates.
Een verloren update is een situatie in databasebeheer waarbij één transactie de wijzigingen van een andere transactie overschrijft, wat leidt tot verlies van gegevens. Dit gebeurt meestal wanneer meerdere transacties gelijktijdig proberen dezelfde gegevens bij te werken, en de wijzigingen van de ene transactie worden overschreven door een andere transactie voordat ze in de database zijn vastgelegd.
Verloren updates treden op wanneer twee parallelle transacties proberen dezelfde rij te wijzigen. Hierdoor overschrijft de transactie die als laatste wordt bevestigd de waarden die door andere transacties zijn bevestigd.
Implementatie
We kunnen dit isolatieniveau ook specificeren met de volgende commando's:
-- Start transaction
BEGIN;
-- Set the isolation level for the session
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
/* Transaction query */
COMMIT;
Het is belangrijk op te merken dat Read Committed het standaard isolatieniveau is voor de meeste Database Management Systemen, waardoor we het niet hoeven te specificeren.
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.