Vermijden dat een record wordt overschreven.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

P Dries

P Dries

21/12/2010 23:29:27
Quote Anchor link
Hallo,
De verhuring van standen op onze tweedehandsbeurs gebeurt online. Ik heb een tabel aangemaakt waarin elke record een stand is. In elke record komen de gegevens van de huurder en een veld dat aangeeft of deze stand nog vrij is.
Via een eerste pagina waarin de nog vrije standen getoond worden, komen de kandidaat-huurders op een formulier-pagina terecht. Als de stand inmiddels toch verhuurd blijkt te zijn, krijgt men deze boodschap ("tafel is reeds verhuurd") en kan men terug naar de eerste pagina.
Bij het posten van het formulier wordt de stand gereserveerd en worden de gegevens van de huurder in de record geplaatst.
Nu heb ik ondervonden dat als er meerdere personen tegelijkertijd hun gegevens invullen op deze pagina (voor dezelfde stand dus), de gegevens van de persoon die het laatst zijn gegevens verzend deze van de vorige overschrijft.
Ik heb dit proberen te voorkomen door de pagina elke 90s te laten refreshen om na te gaan of de tafel nog vrij is maar dit is natuurlijk maar een lapmiddel.
Wat kan ik doen op dit overschrijven te voorkomen?
 
PHP hulp

PHP hulp

12/01/2025 13:04:20
 
Bas Cost Budde

Bas Cost Budde

21/12/2010 23:39:20
Quote Anchor link
Testen voordat je het database-update-statement uitvoert: is dit record echt nog vrij?
 
P Dries

P Dries

21/12/2010 23:54:39
Quote Anchor link
Ja inderdaad dat is de bedoeling en ik heb dit geprobeerd d.m.v. een geneste if voor de $updateSQL...
alleen ... de syntax is een ??
 
Bas Cost Budde

Bas Cost Budde

22/12/2010 00:03:17
Quote Anchor link
hoe ziet dat stuk script eruit?

In het proces kun je het misschien als volgt oplossen:
- kiest de huurder een stand, dan haal je direct met ajax de bezetting op; de servlet die die bezetting afgeeft, vergrendelt eerst het record
- bij de tweede huurder die die stand kiest, loopt de servlet tegen de lock aan en kan melden "iemand probeert deze stand te huren". Doe iets slims (een melding wanneer de eerste huurder een beslissing heeft genomen? timeout-toestanden)

Dat vraagt om een lock-mechaniek voor een record. 't Is even inlezen, "race condition" is een van je trefwoorden.

Een andere aanpak is dat je alle reserveringen als aparte records noteert, als het ware als subrecord van de stand. Dan is elke insert een individu, krijgt daarmee (wanneer je een autonummer-veld in de tabel hebt) een uniek volgnummer, en (wanneer je ook now() in de tabel opslaat) een duidelijk moment van registreren. Tegen alle pogingen daarna kun je dus zeggen "sorry, te laat" -- en dan klantvriendelijk vertaald.
 
P Dries

P Dries

24/12/2010 11:30:36
Quote Anchor link
Bedankt Bas, voor je reacties. Wat ik nu al gedaan heb, is het record vergrendelen als iemand het formulier invult. Een tweede gebruiker kan dus niet tegelijkertijd zijn gegevens invullen. Het probleem wordt dan het ontgrendelen als de eerste gebruiker toch besluit zijn gegevens niet te verzenden (uitlogt of naar een andere pagina gaat). Jij spreekt over een timeout. Ik zal daar nog eens verder naar zoeken.

Hetgeen je in je "andere aanpak" voorstelt, had ik al gedeeltelijk gedaan. Ik heb een tweede tabel gemaakt waarin nog eens alle gegevens opgeslagen worden (met autonummering en NOW-veld). Op die manier heb ik trouwens het probleem ontdekt. Ik ga eens verder zoeken hoe ik deze controletabel kan gebruiken om de toegang tot de record in de andere tabel tijdelijk te vergrendelen.
 
John D

John D

24/12/2010 12:18:17
Quote Anchor link
Je datamodellering is niet in orde. Ga niet aan de slag met het updaten van een vast aantal records die tafels/standen vertegenwoordigen. Maak een basisbestand (tabel) met verhuurbare tafels/standen en in deze tabel neem je alle gegevens op die bij deze entiteit horen. Een klant kan hieruit een keuze maken. Vervolgens heb je een tabel verhuur en aan deze tabel voeg je een record toe met de id van de tafel/stand en id van een huurder pas zodra de huurder een keuze maakt (table huurder) en in dit record neem je datum_van en datum_tot op. Zo kan je in de verhuurtabel testen of een stand al verhuurd is op/van datum x tot datum y.
Gewijzigd op 24/12/2010 12:48:06 door John D
 
P Dries

P Dries

26/12/2010 21:37:49
Quote Anchor link
Dag John, zoals ik jouw datamodellering zie, verandert dit niets aan mijn probleem. Mijn probleem is de tijd tussen het ingeven en verzenden van gegevens. Het googelen naar meer info over "record locking" bracht me bijvoorbeeld hier terecht:
http://www.webcheatsheet.com/php/record_locking_in_web_applications.php
Ik denk dat dit artikel mijn vraag goed omschrijft.
Gewijzigd op 26/12/2010 21:42:41 door P Dries
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.