Basis van databases

De voorraad van een product in de tabel Voorraad is 10. Transactie T1 leest de voorraad en schrijft de waarde min 3 terug, en T2 leest de voorraad en schrijft de waarde min 5 terug. Als ze zonder locks worden uitgevoerd in de volgorde T1 leest, T2 leest, T1 schrijft, T2 schrijft, wat is dan de uiteindelijke voorraad?

  1. A2
  2. B5
  3. C7
Antwoord en toelichting tonen

Antwoord: B. 5

T1 en T2 lezen allebei de voorraad van 10 voordat de ander heeft geschreven. T1 schrijft 10 − 3 = 7, maar T2 overschrijft dat vervolgens met 10 − 5 = 5, berekend uit de 10 die het had gelezen, dus de uiteindelijke voorraad is 5. Het had 10 − 3 − 5 = 2 moeten zijn, het resultaat van de twee bewerkingen na elkaar; de wijziging van T1 is verloren gegaan. Dit heet een lost update (verloren wijziging). Om dit te voorkomen, neem je bij het lezen een exclusieve lock, zodat het lezen door T2 wacht tot T1 klaar is (bijvoorbeeld met SELECT … FOR UPDATE), of voer je lezen en schrijven in één SQL-statement uit, zoals in UPDATE Voorraad SET Aantal = Aantal - 3.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Basis van databases

  1. Welke beschrijving van een dirty read, een van de problemen die optreden als transacties gelijktijdig lopen, is juist?
  2. Transactie T1 voerde SELECT COUNT(*) FROM Bestelling WHERE Bedrag >= 1000 uit en kreeg 8. Direct daarna voegde T2 met INSERT een rij toe voor een bestelling met een bedrag van 2000 en voerde een commit uit. Toen T1 hetzelfde SELECT-statement opnieuw uitvoerde, kreeg het 9. Welk verschijnsel is dit?
  3. Welk antwoord noemt van de isolatieniveaus die de SQL-standaard definieert juist de verschijnselen die bij READ COMMITTED kunnen optreden?
  4. Transactie T1 heeft een gedeelde lock op een rij en leest die. T2 vraagt een gedeelde lock en T3 een exclusieve lock op dezelfde rij aan. Wat is juist voor de periode tot T1 zijn lock vrijgeeft?
  5. Welke beschrijving van tweefasenvergrendeling (two-phase locking, 2PL), die voor het gelijktijdigheidsbeheer van transacties wordt gebruikt, is juist?