Delen via


Isolatieniveaus begrijpen

JDBC-stuurprogramma downloaden

Transacties geven een isolatieniveau op waarmee wordt gedefinieerd hoe één transactie wordt geïsoleerd van andere transacties. Isolatie is de scheiding van resource- of gegevenswijzigingen die door verschillende transacties zijn aangebracht. Isolatieniveaus worden beschreven waarvoor bijwerkingen van gelijktijdigheid zijn toegestaan, zoals vuile lezingen of fantoomlezingen.

Transactieisolatieniveaus bepalen de volgende effecten:

  • Of er vergrendelingen worden genomen wanneer gegevens worden gelezen en welk type vergrendelingen worden aangevraagd.

  • Hoe lang de leesvergrendelingen worden bewaard.

  • Verwijzen leesbewerkingen naar rijen die zijn gewijzigd door een andere transactie?

    • Blokkeer totdat de exclusieve vergrendeling op de rij is ontgrendeld.

    • Haal de vastgelegde versie op van de rij die bestond op het moment dat de instructie of transactie werd gestart.

    • Lees de niet-doorgevoerde gegevenswijziging.

Een isolatieniveau kiezen

Het kiezen van een transactieisolatieniveau heeft geen invloed op de vergrendelingen die worden verkregen om gegevenswijzigingen te beveiligen. Een transactie krijgt altijd een exclusieve vergrendeling op alle gegevens die worden gewijzigd. Deze vergrendeling wordt vastgezet totdat de transactie is voltooid, ongeacht het isolatieniveau dat voor die transactie is ingesteld. Voor leesbewerkingen definiëren transactieisolatieniveaus voornamelijk hoe de bewerking wordt beschermd tegen de effecten van andere transacties.

Een lager isolatieniveau verhoogt de mogelijkheid van veel gebruikers om tegelijkertijd toegang te krijgen tot gegevens. Maar het verhoogt het aantal gelijktijdigheidseffecten, zoals vuile lezingen of verloren updates, die gebruikers zouden kunnen tegenkomen. Omgekeerd vermindert een hoger isolatieniveau de typen gelijktijdigheidseffecten die gebruikers kunnen zien. Er zijn echter meer systeemresources nodig en de kans dat een transactie een andere transactie blokkeert, vergroot. Het kiezen van het juiste isolatieniveau is afhankelijk van het verdelen van de vereisten voor gegevensintegriteit van de toepassing tegen de overhead van elk isolatieniveau.

Het hoogste isolatieniveau, serialiseerbaar, garandeert dat een transactie exact dezelfde gegevens ophaalt telkens wanneer een leesbewerking wordt herhaald. Er wordt echter een vergrendelingsniveau gebruikt dat waarschijnlijk van invloed is op andere gebruikers in systemen met meerdere gebruikers. Het laagste isolatieniveau, read uncommitted, kan gegevens ophalen die zijn gewijzigd, maar niet zijn vastgelegd door andere transacties. Alle bijwerkingen van gelijktijdigheid kunnen optreden bij "read uncommitted", maar er is geen leesvergrendeling of versiebeheer, dus de overhead wordt geminimaliseerd.

Opmerkingen

In de volgende tabel ziet u de gelijktijdigheidseffecten die zijn toegestaan door de verschillende isolatieniveaus.

Isolatieniveau Onvolledige Uitlezing Niet-herhaalbare leesbewerking Phantom
Niet-verzonden lezen Yes Yes Yes
Vastgelegd lezen Nee. Yes Yes
Herhaalbare leesbewerking Nee. Nee. Yes
Momentopname Nee. Nee. Nee.
Serieerbaar Nee. Nee. Nee.

Transacties moeten worden uitgevoerd op isolatieniveau van ten minste herhaalbare leesbewerkingen om verloren updates te voorkomen die kunnen optreden wanneer twee transacties elke keer dezelfde rij ophalen. De transactie werkt vervolgens de rij bij op basis van de oorspronkelijk opgehaalde waarden. Als de twee transacties rijen bijwerken met één UPDATE-instructie en de update niet baseren op de eerder opgehaalde waarden, kunnen verloren updates niet plaatsvinden op het standaardisolatieniveau van doorgevoerde leesbewerkingen.

Als u het isolatieniveau voor een transactie wilt instellen, kunt u de methode setTransactionIsolation van de klasse SQLServerConnection gebruiken. Deze methode accepteert een int-waarde als argument, dat is gebaseerd op een van de verbindingsconstanten, zoals in de volgende:

con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

Als u het nieuwe isolatieniveau voor momentopnamen van SQL Server wilt gebruiken, kunt u een van de SQLServerConnection constanten gebruiken:

con.setTransactionIsolation(SQLServerConnection.TRANSACTION_SNAPSHOT);

of u kunt het volgende gebruiken:

con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED + 4094);

Zie 'Isolatieniveaus in de database-engine' in SQL Server Books Online voor meer informatie over isolatieniveaus van SQL Server.

Zie ook

Transacties uitvoeren met het JDBC-stuurprogramma
transactie-isolatieniveau (Transact-SQL) instellen