Delen via


Isolatieniveaus voor transacties (ODBC)

Isolatieniveaus voor transacties zijn een meting van de mate waarin transactieisolatie slaagt. In het bijzonder worden transactieisolatieniveaus gedefinieerd door de aanwezigheid of afwezigheid van de volgende verschijnselen:

  • Vuile leesbewerkingen Een vuile leesbewerking treedt op wanneer een transactie gegevens leest die nog niet zijn doorgevoerd. Stel dat transactie 1 een rij bijwerkt. Transactie 2 leest de bijgewerkte rij voordat transactie 1 de update doorvoert. Als transactie 1 de wijziging terugdraait, heeft transactie 2 gegevens gelezen die worden beschouwd als nooit te hebben bestaan.

  • Niet-leesbare leesbewerkingen Een niet-opnieuw leesbare leesbewerking treedt op wanneer een transactie dezelfde rij twee keer leest, maar telkens verschillende gegevens ophaalt. Stel dat transactie 1 een rij leest. Transactie 2 werkt die rij bij of verwijdert die en voert de wijziging door of verwijdert die. Als transactie 1 de rij opnieuw heeft gelezen, worden er verschillende rijwaarden opgehaald of wordt gedetecteerd dat de rij is verwijderd.

  • Fantomen Een fantoom is een rij die overeenkomt met de zoekcriteria, maar die in eerste instantie niet wordt gezien. Stel dat transactie 1 een set rijen leest die voldoen aan een aantal zoekcriteria. Transactie 2 genereert een nieuwe rij (via een update of een insert) die overeenkomt met de zoekcriteria voor transactie 1. Als transactie 1 de instructie die de rijen leest, opnieuw uitvoert, krijgt deze een andere set rijen.

De vier isolatieniveaus van transacties (zoals gedefinieerd door SQL-92) worden gedefinieerd in termen van deze verschijnselen. In de volgende tabel markeert een 'X' elk fenomeen dat kan optreden.

Niveau van transactieisolatie Vuile leesbewerkingen Niet-herhaalbare leesbewerkingen Fantomen
Niet-verzonden lezen X X X
Vastgelegd lezen -- X X
Herhaalbare leesbewerking -- -- X
Serieerbaar -- -- --

In de volgende tabel worden eenvoudige manieren beschreven waarop een DBMS de isolatieniveaus voor transacties kan implementeren.

Belangrijk

De meeste DBMS's gebruiken complexere schema's dan deze om gelijktijdigheid te verhogen. Deze voorbeelden worden alleen ter illustratie verstrekt. ODBC bepaalt met name niet hoe bepaalde DBMS-transacties van elkaar isoleren.

Transactieisolatie Mogelijke implementatie
Niet-verzonden lezen Transacties worden niet van elkaar geïsoleerd. Als DBMS ondersteuning biedt voor andere isolatieniveaus voor transacties, negeert het welk mechanisme het ook gebruikt om deze niveaus te implementeren. Zodat ze geen nadelige gevolgen hebben voor andere transacties, zijn transacties die worden uitgevoerd op het "Read Uncommitted"-niveau meestal in alleen-lezenmodus.
Vastgelegd lezen De transactie wacht totdat rijen die door andere transacties vergrendeld zijn voor schrijven, zijn ontgrendeld; dit voorkomt dat er 'onzorgvuldige' gegevens worden gelezen.

De transactie bevat een leesvergrendeling (als deze alleen de rij leest) of schrijfvergrendeling (als deze de rij bijwerkt of verwijdert) in de huidige rij om te voorkomen dat andere transacties deze bijwerken of verwijderen. De transactie geeft leesvergrendelingen vrij wanneer deze de huidige rij verlaat. Het houdt schrijfvergrendelingen vast totdat het is doorgevoerd of teruggedraaid.
Herhaalbare leesbewerking De transactie wacht totdat rijen die door andere transacties vergrendeld zijn, worden ontgrendeld; dit voorkomt dat er 'vuile' gegevens worden gelezen.

De transactie bevat leesvergrendelingen voor alle rijen die worden geretourneerd naar de toepassing en schrijfvergrendelingen voor alle rijen die worden ingevoegd, bijgewerkt of verwijderd. Als de transactie bijvoorbeeld de SQL-instructie SELECT * FROM Orders bevat, vergrendelt de transactie rijen terwijl de toepassing deze ophaalt. Als de transactie de SQL-instructie DELETE FROM Orders WHERE Status = 'CLOSED' bevat, vergrendelt de transactie rijen terwijl deze worden verwijderd.

Omdat andere transacties deze rijen niet kunnen bijwerken of verwijderen, vermijdt de huidige transactie niet-herhaalbare lezingen. De transactie geeft de vergrendelingen vrij wanneer deze wordt doorgevoerd of teruggedraaid.
Serieerbaar De transactie wacht totdat rijen die door andere transacties schrijf-vergrendeld zijn, ontgrendeld worden; dit voorkomt dat er 'vuile' gegevens worden gelezen.

De transactie bevat een leesvergrendeling (als deze alleen rijen leest) of schrijfvergrendeling (als deze rijen kan bijwerken of verwijderen) in het bereik van rijen dat van invloed is op de transactie. Als de transactie bijvoorbeeld de SQL-instructie SELECT * FROM Orders bevat, is het bereik de hele tabel Orders; de transactie vergrendelt de tabel en staat niet toe dat er nieuwe rijen in de tabel worden ingevoegd. Als de transactie de SQL-instructie DELETE FROM Orders WHERE Status = 'CLOSED' bevat, is het bereik alle rijen met de status 'GESLOTEN'; met de transactie worden alle rijen in de tabel Orders vergrendeld met de status 'GESLOTEN' en kunnen geen rijen worden ingevoegd of bijgewerkt, zodat de resulterende rij de status 'GESLOTEN' heeft.

Omdat andere transacties de rijen in het bereik niet kunnen bijwerken of verwijderen, voorkomt de huidige transactie niet-herhaalbare lezingen. Omdat andere transacties geen rijen in het bereik kunnen invoegen, voorkomt de huidige transactie eventuele phantoms. De transactie geeft zijn slot vrij wanneer deze wordt doorgevoerd of teruggedraaid.

Het is belangrijk te weten dat het niveau van transactieisolatie geen invloed heeft op de mogelijkheid van een transactie om zijn eigen wijzigingen te zien; transacties kunnen altijd wijzigingen zien die ze aanbrengen. Een transactie kan bijvoorbeeld bestaan uit twee UPDATE-instructies, waarvan de eerste het loon van alle werknemers met 10 procent verhoogt en de tweede het loon van werknemers instelt op een bepaald maximumbedrag. Dit lukt alleen als één transactie omdat de tweede UPDATE-instructie de resultaten van de eerste kan zien.