- Index
Veronderstellen we dat een bezoeker
In login.exe (de enige geldige entry point), maken we een record aan voor de klant aan de hand van zijn login en de huidige tijd. Onze klant wordt aldus intern geïdentificeerd door volgende sleutel: Ew3Zq0ea (sessie identificatie). We moeten ervoor zorgen dat de sleutel uniek is (als de klant-login uniek is is dit geen probleem). We slaan de naam lokaal op als een bestand Ew3Zq0ea.1 en sturen de sessie-identificatie door als een hidden field.
In order.exe controleren we of er een bestand bestaat voor onze klant: we vergelijken de sessie-identifikatie van de klant met onze interne lijst:
In confirm.exe, volgen we dezelfde procedure. Als de sessie identifikatie overeenkomt voeren we de transaktie uit. Weer een tevreden klant!
order.exe kan bereikt worden via zowel login.exe (de normale manier), maar ook via confirm.exe (als de gebruiker op zijn stappen terugkeert). In dit geval moeten we de order.exe-formulier opnieuw aan de klant aanbieden, maar nu met de reeds ingevulde velden, zodat de klant de gegevens enkel moet wijzigen indien nodig.
Wat zetten we in de identifikatiebestand? Eigenlijk moet daar niets ingevuld worden: de meeste informatie zit reeds in de naam zelf: klantenlogin, referer-pagina (1, 2 of 3) en time stamp. Het bestand kan bijvoorbeeld gebruikt worden om de bestelde artikels in op te slaan, totdat de bestelling volledig verwerkt is. Dit bestand zit veilig op de server, het kan dus gebruikt worden om gegevens op te slaan die niet zichtbaar mogen zijn voor de klant (winstmarge,...)
Bij het begin van de verwerking openen we de sessie identifikatiebestand als LOCK READ WRITE (dit is trouwens de default-waarde). Indien het bestand niet exclusief geopend kan worden is dit een teken dat het bestand reeds in gebruik is door eenzelfde klant dat meermalen op de SUBMIT-knop gedrukt heeft. De eerste uitvoering kan het bestand openen (en locken), de andere uitvoeringen mogen gerust afgebroken worden.
Als het bestand niet bestaat is het een teken van het volgende:
In onze verwerking moeten we ervoor zorgen dat de sessie identifikatiebestand (semaphore) bestaat op het ogenblik dat de verwerking gestart wordt; dat de semaphore gelockt kan worden. Indien aan deze voorwaarden voldaan kan worden, mag de verwerking plaatsvinden. Op het einde wissen we de semaphore en maken we indien nodig een volgende semaphore aan voor de volgende stap in de bestelling.
Veronderstel dat een record uit de database moet gewijzigd worden. Daarvoor zijn er twee programma's: get_record dat de huidige gegevens van de database opvraagt en ze aan de gebruiker toont in de vorm van een formulier dat gewijzigd kan worden en put_record dat het gewijzigd formulier terug in de database schrijft.
Veronderstel dat twee gebruikers eenzelfde record willen wijzigen:
Hoe kunnen we weten of een record gewijzigd wordt door twee gebruikers?
Dit kan heel eenvoudig door een version-control veld bij te voegen bij iedere record: artikel.writecount (writecount kan een gewone integer zijn). iedere keer dat een record gelezen wordt, wordt de version-control veld mee gelezen en in de semaphore van de betreffende user geschreven.
Bij het schrijven wordt de version-control met één verhoogd.
Als Gebruiker_B op zijn beurt de gewijzigde gegevens wilt terugschrijven, dan zal het programma merken dat de version control van het record niet meer overeenkomt met de version control zoals in de semaphore opgetekend werd (de originele waarde). Het terugschrijven van de gegevens kan niet doorgaan. We bieden Gebruiker_B het record opnieuw aan, maar gebruiken nu de versie zoals door Gebruiker_A weggeschreven werd.
De database en het onderliggend operating system moeten atomic write ondersteunen om optimistic concurrency mogelijk te maken. Een atomic write is een reeks handelingen die bij elkaar horen en die niet halverwege onderbroken mogen worden. Bij een multi-tasking systeem loop je altijd het gevaar dat je programma op een bepaalde plaats (en tijd) onderbroken wordt, met alle nare gevolgen vandien voor de database integriteit.
De benaming optimistic concurrency werd gekozen omdat we ervan uitgaan dat de gegevens vaker gelezen zullen worden en slechts in uitzonderlijke gevallen veranderd worden. Als ze veranderd worden, is het uitzonderlijk dat twee gebruikers dezelfde records proberen te wijzigen. Deze veronderstelling klopt bij web-transacties. De benaming "mid-air collision" wordt gebruikt als de noodprocedure in gang moet gezet worden (gegevens simultaan door twee gebruikers gewijzigd).
Individuele landingspage bezoekers: