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?
- A2
- B5
- 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.