10.7. Locking; Commit; Rollback

Bij grote databases moet je er rekening mee houden dat twee personen tegelijk iets willen veranderen.
Dat wordt Concurrency genoemd, je hebt dan concurrente processen.

Dit kan bijvoorbeeld voorkomen als een reisbureau een boeking verricht.
Op het moment dat het ene reisbureau een vliegtuigstoel reserveert moet voor een ander reisbureau de toegang tot dit record geblokkeerd zijn, totdat de transactie van de eerste is afgerond.
Anders kan het gebeuren dat een stoel dubbel gereserveerd wordt.

Het DBMS voorkomt dubbele boekingen door locking toe te passen. De toegang tot het record, waar iets mee gebeurt, wordt geblokkeerd als het wordt gewijzigd.

Een ander voorbeeld is het overboeken van geld bij een bank.
Als iemand € 100,- over wil boeken van rekening 1 naar rekening 2, dan wordt er eerst 100,- van rekening 1 afgeschreven.
Voordat dat gebeurt wordt er eerst een lock aangevraagd op rekening 1. Pas als het systeem de rekening voor anderen op slot heeft gezet wordt de 100,- van rekening 1 afgeschreven.
Dan moet er nog 100,- op rekening 2 worden bijgeschreven.
Er wordt dan een lock aangevraagd op rekening 2, rekening 1 blijft nog op slot voor anderen. Als rekening 2 voor anderen op slot is gezet wordt de 100,- op rekening 2 bijgeschreven.
En daarna worden rekening 1 en rekening 2 weer vrijgegeven, het lock wordt opgeheven.

Maar deze oplossing kan ook weer problemen opleveren.

Stel je voor dat iemand € 100,- over wil boeken van rekening 1 naar rekening 2, en dat heel toevallig iemand anders op precies hetzelfde moment € 75,- over wil boeken van rekening 2 naar rekening 1.

Persoon nr. 1 doet de eerste boeking. Er wordt een lock op rekening 1 gezet en de 100,- wordt van rekening 1 afgeschreven.
Dan moet er nog 100,- op rekening 2 worden bijgeschreven.
Tegelijkertijd doet persoon nr. 2 de tweede boeking. Er wordt een lock op rekening 2 gezet en de 75,- wordt van rekening 2 afgeschreven.
Dan moet er nog 75,- op rekening 1 worden bijgeschreven.
Door het proces van persoon nr. 1 wordt er een lock aangevraagd op rekening 2, maar die rekening wordt niet vrijgegeven want het proces van persoon nr. 2 is daar nog bezig.
Door het proces van persoon nr. 2 wordt er een lock aangevraagd op rekening 1, maar die rekening wordt niet vrijgegeven want het proces van persoon nr. 1 is daar nog bezig.
Ze wachten dus op elkaar, dat wordt een deadlock genoemd.

Als er geen rekening met een deadlock gehouden zou worden dan zou het kunnen gebeuren dat processen eeuwig op elkaar blijven wachten.

Een DBMS houdt een logboek bij met alle transactieactiviteiten. Voordat een transactie de database mag wijzigen wordt deze eerst opgeslagen in het logboek.
Het punt waarop alle stappen van een transactie in het logboek zijn opgeslagen wordt het commitpunt genoemd.
Op dit punt heeft het DBMS alle informatie die het nodig kan hebben om de transactie te kunnen reconstrueren als dat nodig zou zijn. Het DBMS is dan klaar om zich als het ware over te geven (engels: commit).
Bij de SQL-opdracht Commit wordt ervoor gezorgd dat een transactie daadwerkelijk word uitgevoerd.
Bij een storing kan de database hersteld worden door alle onvolledige transacties terug te draaien. Dit wordt aangeduid met de engelse term rollback.
Niet alleen bij een storing gebeurt dat, een transactie kan ook worden afgebroken doordat het systeem de toegang tot bepaalde informatie weigert. Of wanneer er een deadlock is opgetreden, waarbij twee transacties op elkaar wachten.