Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Transaktionsisoleringsnivåer är ett mått på i vilken utsträckning transaktionsisoleringen lyckas. I synnerhet definieras transaktionsisoleringsnivåer av förekomsten eller frånvaron av följande fenomen:
Smutsiga läsningar En smutsig läsning inträffar när en transaktion läser data som ännu inte har bekräftats. Anta till exempel att transaktion 1 uppdaterar en rad. Transaktion 2 läser den uppdaterade raden innan transaktion 1 genomför uppdateringen. Om transaktion 1 återställer ändringen kommer transaktion 2 att ha läsdata som anses aldrig ha funnits.
Icke-repeterbara läsningar En icke-repeterbar läsning inträffar när en transaktion läser samma rad två gånger men får olika data varje gång. Anta till exempel att transaktion 1 läser en rad. Transaktion 2 uppdaterar eller tar bort raden och genomför uppdateringen eller borttagningen. Om transaktion 1 läser om raden hämtar den olika radvärden eller upptäcker att raden har tagits bort.
Fantomer En fantom är en rad som matchar sökvillkoren, men som inte visas från början. Anta till exempel att transaktion 1 läser en uppsättning rader som uppfyller vissa sökvillkor. Transaktion 2 genererar en ny rad (antingen via en uppdatering eller en infogning) som matchar sökvillkoren för transaktion 1. Om transaktion 1 kör om instruktionen som läser raderna, får den en annan uppsättning rader.
De fyra transaktionsisoleringsnivåerna (som definieras av SQL-92) definieras i termer av dessa fenomen. I följande tabell markerar ett "X" varje fenomen som kan inträffa.
| Transaktionsisoleringsnivå | Smutsiga läsningar | Icke-repeterbara läsningar | Fantomer |
|---|---|---|---|
| Läsa okommenterade | X | X | X |
| Läs bekräftad | -- | X | X |
| Repeterbar läsning | -- | -- | X |
| Serialiserbar | -- | -- | -- |
I följande tabell beskrivs enkla sätt som en DBMS kan implementera transaktionsisoleringsnivåer på.
Viktigt!
De flesta DBMS använder mer komplexa scheman än dessa för att öka samtidigheten. De här exemplen tillhandahålls endast i illustrationssyfte. I synnerhet anger ODBC inte hur specifika DBMS isolerar transaktioner från varandra.
| Transaktionsisolering | Möjlig implementation |
|---|---|
| Läsa okommenterade | Transaktioner är inte isolerade från varandra. Om DBMS stöder andra transaktionsisoleringsnivåer ignoreras den mekanism som används för att implementera dessa nivåer. Så att de inte påverkar andra transaktioner negativt, är transaktioner som körs på nivån Läs ej förpliktad vanligen endast för läsning. |
| Läs bekräftad | Transaktionen väntar tills rader som är skrivlåsta av andra transaktioner blir upplåsta. Detta förhindrar att den läser "smutsiga" data. Transaktionen innehåller ett läslås (om den bara läser raden) eller skrivlås (om den uppdaterar eller tar bort raden) på den aktuella raden för att förhindra att andra transaktioner uppdaterar eller tar bort den. Transaktionen släpper läslås när den flyttas bort från den aktuella raden. Den håller skrivlås tills transaktionen har bekräftats eller har rullats tillbaka. |
| Repeterbar läsning | Transaktionen väntar tills rader som är låsta för skrivning av andra transaktioner har låsts upp, vilket förhindrar läsning av "smutsiga" data. Transaktionen innehåller läslås på alla rader som den returnerar till programmet och skriver lås på alla rader som den infogar, uppdaterar eller tar bort. Om transaktionen till exempel innehåller SQL-instruktionen SELECT * FROM Orders låser transaktionen rader när programmet hämtar dem. Om transaktionen innehåller SQL-instruktionen DELETE FROM Orders WHERE Status = 'CLOSED', låser transaktionen rader när den tar bort dem. Eftersom andra transaktioner inte kan uppdatera eller ta bort dessa rader undviker den aktuella transaktionen eventuella icke-repetitiva läsningar. Transaktionen släpper sina lås när den godkänns eller återställs. |
| Serialiserbar | Transaktionen väntar tills rader som är skrivlåsta av andra transaktioner låses upp. Detta förhindrar att den läser "smutsig" data. Transaktionen innehåller ett läslås (om det bara läser rader) eller skrivlås (om det kan uppdatera eller ta bort rader) på radintervallet som det påverkar. Om transaktionen till exempel innehåller SQL-instruktionen SELECT * FROM Orders är intervallet hela tabellen Beställningar. transaktionsläsningen låser tabellen och tillåter inte att några nya rader infogas i den. Om transaktionen innehåller SQL-instruktionen DELETE FROM Orders WHERE Status = 'CLOSED', är intervallet alla rader med statusen "STÄNGD"; transaktionen låser alla rader i tabellen Beställningar med statusen "STÄNGD" och tillåter inte att några rader infogas eller uppdateras så att den resulterande raden har statusen "STÄNGD". Eftersom andra transaktioner inte kan uppdatera eller ta bort raderna i intervallet undviker den aktuella transaktionen läsningar som inte kan återskapas. Eftersom andra transaktioner inte kan infoga några rader i intervallet undviker den aktuella transaktionen eventuella fantomer. Transaktionen frigör låset när den kommitteras eller rullas tillbaka. |
Det är viktigt att observera att transaktionsisoleringsnivån inte påverkar en transaktions förmåga att se sina egna ändringar. transaktioner kan alltid se alla ändringar de gör. En transaktion kan till exempel bestå av två UPDATE-instruktioner , varav den första höjer lönen för alla anställda med 10 procent och den andra anger lönen för alla anställda över ett visst maximalt belopp till det beloppet. Detta lyckas bara som en enskild transaktion eftersom den andra UPDATE-instruktionen kan se resultatet av den första.