Welke anomalieën kunnen optreden bij het uitvoeren van parallelle transacties?
sobes.tech AI
Antwoord van AI
Bij het gelijktijdig uitvoeren van transacties kunnen de volgende anomalieën optreden:
-
Verloren update (Lost Update): Een transactie overschrijft de wijzigingen van een andere transactie voordat deze zijn vastgelegd.
Tijd Transactie 1 Transactie 2 t1 Leest de waarde van Saldo (bijvoorbeeld 100) t2 Leest de waarde van Saldo (bijvoorbeeld 100) t3 Verhoogt Saldo met 10 (Saldo = 110) t4 Verhoogt Saldo met 20 (Saldo = 120) t5 Bevestigt de wijzigingen (Saldo wordt 110) t6 Bevestigt de wijzigingen (Saldo wordt 120) Resultaat: Ondanks de twee verhogingen is de uiteindelijke Saldo-waarde 120, niet 130. De verhoging door Transactie 1 is verloren gegaan.
-
Vuil lezen (Dirty Read): Een transactie leest niet-gefixeerde wijzigingen van een andere transactie. Als de wijzigende transactie wordt teruggedraaid, blijken de gelezen gegevens ongeldig.
Tijd Transactie 1 Transactie 2 t1 Begint met wijzigen van Saldo (100 -> 110) t2 Leest Saldo (krijgt 110) t3 Wijzigt en draait terug (Saldo terug naar 100) t4 Gebruikt Saldo = 110 in berekeningen, terwijl de feitelijke waarde 100 is Resultaat: Transactie 2 baseert zijn acties op gegevens die uiteindelijk niet zijn vastgelegd.
-
Niet-herhaalbaar lezen (Non-Repeatable Read): Tijdens één transactie worden bij herhaald lezen van dezelfde rij verschillende waarden verkregen, omdat een andere transactie de wijziging van die rij heeft vastgelegd tussen de lezingen.
Tijd Transactie 1 Transactie 2 t1 Leest Saldo (krijgt 100) t2 Wijzigt Saldo naar 110 en bevestigt t3 Leest opnieuw Saldo (krijgt 110 in plaats van 100) Resultaat: Het Saldo is gewijzigd binnen dezelfde transactie, wat kan leiden tot onjuiste resultaten.
-
Fantomlezen (Phantom Read): Lijkt op niet-herhaalbaar lezen, maar betreft niet het wijzigen van bestaande rijen, maar het toevoegen of verwijderen van rijen die de resultaten van een query met een predicaat beïnvloeden.
Tijd Transactie 1 Transactie 2 t1 Voert de query uit SELECT COUNT(*) FROM Orders WHERE Status = 'Pending'(krijgt 5)t2 Voegt een nieuwe order toe met status 'Pending' en bevestigt t3 Voert opnieuw SELECT COUNT(*) FROM Orders WHERE Status = 'Pending'(krijgt 6)Resultaat: Bij herhaalde uitvoering van de query verschijnen "fantom"-rijen die er bij de eerste lezing niet waren.
Deze anomalieën worden voorkomen door gebruik te maken van verschillende isolatieniveaus voor transacties.