31. marts 2003 - 15:02Der er
20 kommentarer og 2 løsninger
Mysql og flerbruger adgang samtidigt
Dette spørgsmål er mere et rent 'tænke' spørgsmål. Jeg er ved at lave en ordredatabase, hvor der skal være mulighed for at ændre i en eksisterende ordre. Der er flere brugere til systemet. Det hele er lavet i php med en mysql database.
Problemet, jeg sidder og kæmper med, består i, at når en bruger ønsker at rette i en given ordre vil en anden bruger også have mulighed for at rette i den samme pågældende ordre, som systemet er skruet sammen nu. Dette må ikke lade sig gøre.
Måden jeg havde tænkt mig at løse det på (som jeg føler ikke er den bedste løsning), ville være at indsætte en kolonne kaldet 'writeable' med datatypen: ENUM('true', 'false'). Alle ordre ville have værdien true som standardværdi. Hvis en bruger ønskede at rette i ordren vil jeg ændre værdien fra 'true' til 'false', så andre brugere ikke kan rette samtidigt. Når brugeren var færdig ville jeg ændre væredien tilbage igen. Men hvad nu hvis brugeren forlader computeren og ikke bliver færdig eller forlader programmet uventet? Så er værdien jo false og man vil ikke sidenhen kunne lave rettelser....
Så mit spørgsmå er, om der ikke er en lettere løsning?
jeg tror jeg ville sætte en tid på i stedet... således at den kun kan ændres i f.eks 5 minutter... - og så bare lave et felt der indeholder dato/tid for åbning...
I stedet for en tidsfaktor, saa kan man bruge laase tabeller - nogle gange enkelte raekker - i de fleste databaser. Jeg ved ikke med raekker, men man kan ogsaa laase tabeller i MySql. Det er ikke helt simpelt, saa tegn dine queries ned paa et stykke papir foerst. Bedst, fin d en tutorial paa nettet.
Af hvad jeg husker. Der findes to slags laase. - Read lock - Write lock
Readloack saettes, naar man henter data fra en tabel, saa den ikke opdateres, mens en bruger laeser og tolker. Naar han er faerdig, skal den fjernes igen.
En writelock saettes, naar en bruger vil skrive til tabellen. Brugeren faar ikke mulighed at skrive, foer alle tidligere readlocks er fjernet.
Date() kan godt returnere tiden. Det afhaenger af argumentet. Soeg evt paa date paa php.net
Den foreslaede date("Y-m-d") giver en dato. Tilfoejes H:i:s kommer timer:ninutter:sekunder med.
sekunder siden 1970 == time() == date('U')
Alternativt, saa kan MySql give et timestamp vha. at indsatte CURDATE() i stedet for en dato i tabellen. Bare vaer opmaeksom paa, at hvis sql-server og web-server er to forskellige maskiner, saa vil php funktioner som date() og time() give anderledes tider en CURDATE() fra MySql. Saa vaer konsekvent naar du laver et site.
Ja, hvad mener jeg egentlig... programmet/scriptet er bygget op så flere brugere kan benytte det samtidigt. Jeg ønsker nu at lave det, så man kan rette i en tidligere indskrevet ordre. Og så var det jeg tænkte at hvis to personer fik den samme idé; at rette i den samme ordre, samtidigt, ville det ikke gå godt.
Jeg stillede så spørgsmålet for at høre om folks erfaringer med dette problem i MySQL. Jeg har endnu ikke taget stilling til hvilken metode jeg benytter, derfor har jeg hellere ikke givet point endnu.
Du har måske et andet godt forslag? Jeg er ikke så meget for at LOCK'e tabellen, da (mener jeg) andre ikke vil have mulighed for at skrive til tabellen i dette tidsrum, og det er ikke godt.
MySQL locker selv tabellen når du laver en UPDATE eller INSERT. Det er kun hvis du vil være på helt sikre side at du kan locke tabellen manuelt. Jeg kan ikke se nogen grund til dette eftersom der næppe sidder nogen og updater ordre flere gange i sekundet :)
Bruger 1 requester PHP side som laver SELECT Bruger 2 requester PHP side som laver SELECT Bruger 1 submitter form som laver UPDATE Bruger 2 submitter form som laver UPDATE
Hvad tror du der er sket med bruger 1's rettelser ?
Problemet er at få låst recorden i.f.m. SELECT indtil UPDATE, men også at kunne håndtere situationen med ingen UPDATE.
Et alternativt approach var at sætte et versions nummer på rækkerne, sende det med ud som hidden felt som svar på request og med tilbage i form submit. Så kan man sammenligne det det modtagne i den submittede form med det faktisk i databasen og hvis det ikke matcher så undlade UPDATE og sende brugeren de nye data.
(det er noget nemmere at locke i få millisekunder internt i en request end i de sekunder/minutter der er mellem vis data og submit ændringer requests)
Så er jeg ved at være til vejs ende med problemet. Undskyld det har taget så lang tid.
Jeg har læst at MySQL kun låser databasen mens PHP scriptet bliver afviklet og det duer ikke for mit vedkommende. Derudover låser MySQL hele tabellen og ikke kun en enkelt række og det dur hellere ikke derfor bliver løsningen at indsætte serverens tid - i en kolonne ud for hver række - i databasen, når en person ønsker at ændre i tabellen. Efter et givet antal minutter er det så muligt at lave ændringer igen.
Point til de udvalgte lindberg-> du skal have nogle point men har ikke svaret farmer-> du skal hjem og læse lidt mere på MySQL dokumentationen ;-) arne_v-> point til dig også
Stig
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.