Het MySQL-commando LOCK TABLES gaat dus niet werken voor je...
LOCK TABLES locks tables for the current thread. UNLOCK TABLES releases any locks held by the current thread. All tables that are locked by the current thread are implicitly unlocked when the thread issues another LOCK TABLES, or when the connection to the server is closed.
Zodra je verbinding sluit (direct nadat je pagina gegenereerd is, meestal) ben je je locks kwijt.
Sowieso is het niet echt de bedoeling dat je maar even alle tabellen lockt om je gegevens op te halen.
Imho kan je het beste per item in je tabel die je wilt kunnen "locken" een soort "mutex" maken, bijvoorbeeld in een aparte tabel.
Vervolgens ga je dan _eerst_ kijken of er al zo'n "mutex" is gepakt door een andere gebruiker, bijvoorbeeld met:
LOCK TABLE mutexes WRITE;
SELECT userid, locktime FROM mutexes WHERE objectid = X;
dat LOCK TABLES zorgt ervoor dat je een write lock op die tabel krijgt en je dus veilig kan updaten in die tabel, zonder dat iemand anders er "net even tussendoor piept" (en je dus twee personen hebt die beiden te zien krijgen dat er geen lock is).
Vervolgens kijk je of de userid gelijk is aan die van de huidige gebruiker, zoja, dan had ie het lock al en kan ie uiteraard gerust verder gaan

De locktime moet je zelf weten of je dat toe wilt voegen, het levert je een controle mechanisme op voor als er ooit een mutex "te lang" blijft bestaan (bijv meer dan een half uur) en je kan die tijd bijwerken als de gebruiker in kwestie dus opnieuw (impliciet) het lock opvroeg.
Mocht er geen mutex zijn voor dat item, dan voer je een mutex in met je insert query en unlock je de tables. Je gebruiker heeft nu een mutex op dat ene item, niemand anders mag er aan komen.
Mocht er dus wel een mutex zijn (die niet van hemzelf is), dan meld je dat aan je gebruiker en eventueel vermeld je erbij wie het lock had en sinds wanneer.
Je moet die mutex al aanmaken zodra iemand het item wil gaan editten (dus een editform opvraagt) en pas weer vrijgeven (deleten) zodra ie dat formulier gesubmit heeft. Die LOCK TABLES mutexes moet je voor elke handeling op die mutexes-tabel doen en zodra je er klaar mee bent weer vrijgeven natuurlijk (UNLOCK TABLES)
Je hebt dan dus twee lockingmechanismes (die hier al eerder door elkaar gegooid werden) toegepast, de MySQL-locking om te voorkomen dat er twee queries tegelijkertijd op een tabel worden uitgevoerd en je eigen locking om te voorkomen dat twee gebruikers hetzelfde document gaan editten.
[
Voor 15% gewijzigd door
ACM op 25-03-2004 11:51
]