Sobes.tech
Middle+

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.