Delen via


Serialiseerbaarheid

In het ideale geval moeten transacties serialiseerbaar zijn. Transacties worden geacht serialiseerbaar te zijn als de resultaten van transacties die gelijktijdig worden uitgevoerd, hetzelfde zijn als de resultaten wanneer ze serieel, dat wil zeggen één na de andere, worden uitgevoerd. Het is niet belangrijk welke transactie eerst wordt uitgevoerd, alleen dat het resultaat geen combinatie van de transacties weergeeft.

Stel dat transactie A gegevenswaarden vermenigvuldigt met 2 en transactie B 1 toevoegt aan gegevenswaarden. Stel nu dat er twee gegevenswaarden zijn: 0 en 10. Als deze transacties na elkaar worden uitgevoerd, zijn de nieuwe waarden 1 en 21 als transactie A eerst wordt uitgevoerd, of 2 en 22 als transactie B eerst wordt uitgevoerd. Maar wat gebeurt er als de volgorde waarin de twee transacties worden uitgevoerd verschillend is voor elke waarde? Als transactie A eerst wordt uitgevoerd op de eerste waarde en transactie B eerst op de tweede waarde wordt uitgevoerd, zijn de nieuwe waarden 1 en 22. Als deze volgorde wordt omgekeerd, zijn de nieuwe waarden 2 en 21. De transacties zijn serialiseerbaar als 1, 21 en 2, 22 de enige mogelijke resultaten zijn. De transacties zijn niet serialiseerbaar als 1, 22 of 2, 21 een mogelijk resultaat is.

Waarom is serialiseerbaarheid wenselijk? Met andere woorden, waarom is het belangrijk dat de ene transactie eindigt voordat de volgende transactie begint? Houd rekening met het volgende probleem. Een verkoper voert orders in op hetzelfde moment dat een bediende facturen verzendt. Stel dat de verkoper een order van bedrijf X invoert, maar deze niet doorvoert; de verkoper praat nog steeds met de vertegenwoordiger van bedrijf X. De bediende vraagt een lijst met alle openstaande orders aan en detecteert de bestelling voor bedrijf X en stuurt ze een factuur. Nu besluit de vertegenwoordiger van bedrijf X dat ze hun bestelling willen wijzigen, zodat de verkoper deze wijzigt voordat de transactie wordt doorgevoerd. Bedrijf X krijgt een onjuiste factuur.

Als de transacties van de verkoper en de bediende kunnen worden geserialiseerd, zou dit probleem nooit zijn opgetreden. Ofwel de transactie van de verkoper zou zijn voltooid voordat de transactie van de bediende begon, in welk geval de bediende de juiste factuur zou hebben verzonden, of de transactie van de bediende zou zijn voltooid voordat de transactie van de verkoper begon, in welk geval de bediende helemaal geen factuur naar bedrijf X zou hebben verzonden.