Wat is gelijktijdigheidscontrole?
Bij het programmeren van gegevensbeheer is gelijktijdigheidscontrole een mechanisme dat is ontworpen om ervoor te zorgen dat nauwkeurige resultaten worden gegenereerd door gelijktijdige bewerkingen. Die resultaten moeten ook tijdig worden verkregen. Concurrency-controle wordt heel vaak gezien in databases waar gebruikers een cache met doorzoekbare informatie kunnen vinden.
Programmeurs proberen een database zo te ontwerpen dat het effect van belangrijke transacties op gedeelde gegevens serieel equivalent is. Wat dit betekent, is dat gegevens die contact maken met sets transacties zich in een bepaalde staat bevinden waar de resultaten kunnen worden verkregen als alle transacties serieel en in een bepaalde volgorde worden uitgevoerd. Soms zijn die gegevens ongeldig omdat ze gelijktijdig door twee transacties worden gewijzigd.
Er zijn meerdere manieren om ervoor te zorgen dat transacties na elkaar worden uitgevoerd, inclusief het gebruik van wederzijdse uitsluiting en het creëren van een bron die bepaalt welke transacties toegang hebben. Dit is echter overdreven en zal een programmeur niet toestaan om te profiteren van concurrency control in een gedistribueerd systeem. Gelijktijdigheidscontrole maakt de gelijktijdige uitvoering van meerdere transacties mogelijk, terwijl deze transacties uit elkaar worden gehouden, waardoor lineariteit wordt gewaarborgd. Een manier om concurrency-controle te implementeren, is het gebruik van een exclusief slot op een bepaalde resource voor uitvoeringen van seriële transacties die resources delen. Transacties vergrendelen een object dat bedoeld is om te worden gebruikt en als een andere transactie een verzoek indient voor het object dat is vergrendeld, moet die transactie wachten tot het object is ontgrendeld.
Implementatie van deze methode in gedistribueerde systemen omvat lock managers - servers die resource locks afgeven. Dit lijkt sterk op servers voor gecentraliseerde wederzijdse uitsluitingen, waarbij clients vergrendelingen kunnen aanvragen en berichten kunnen verzenden voor het vrijgeven van vergrendelingen op een bepaalde bron. Behoud van seriële uitvoering is echter nog steeds noodzakelijk voor concurrency-controle. Als twee afzonderlijke transacties toegang hebben tot een vergelijkbare objectset, moeten de resultaten vergelijkbaar zijn en alsof deze transacties in een bepaalde volgorde zijn uitgevoerd. Om orde op de toegang tot een bron te waarborgen, wordt tweefasige vergrendeling geïntroduceerd, wat betekent dat transacties geen nieuwe vergrendelingen mogen krijgen bij het loslaten van een afzonderlijk slot.
In tweefasige vergrendeling voor gelijktijdigheidscontrole wordt de initiële fase beschouwd als de groeiende fase, waarbij de transactie de benodigde vergrendeling verkrijgt. De volgende fase wordt beschouwd als een krimpende fase, waarin de transactie zijn vergrendeld. Er zijn problemen met dit type vergrendeling. Als transacties worden afgebroken, kunnen andere transacties gegevens gebruiken van objecten die zijn gewijzigd en ontgrendeld door afgebroken transacties. Dit zou ertoe leiden dat andere transacties worden afgebroken.