Avatar billede stig69 Nybegynder
31. marts 2003 - 15:02 Der 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?

Stig
Avatar billede Brian Moos Lindberg Praktikant
31. marts 2003 - 15:05 #1
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...
Avatar billede stig69 Nybegynder
31. marts 2003 - 15:08 #2
lindberg--> Kan man det med php? Eller skal man bruge javaScript?
Avatar billede Brian Moos Lindberg Praktikant
31. marts 2003 - 15:09 #3
jeg har det vist liggende et eller andet sted i mine arkiver... øjeblik...
Avatar billede Brian Moos Lindberg Praktikant
31. marts 2003 - 15:14 #4
$today = date("Y-m-d");
mysql_query("UPDATE users SET lastlogin = '$today' WHERE username = '$username'");
... kan det bruges ?
Avatar billede Brian Moos Lindberg Praktikant
31. marts 2003 - 15:14 #5
der skal selvfølgelig noget tid på også...
Avatar billede Brian Moos Lindberg Praktikant
31. marts 2003 - 15:19 #6
du kan selvfølgelig også bruge time()
Avatar billede stig69 Nybegynder
31. marts 2003 - 15:32 #7
Måske skulle jeg kombinere det... Men jeg tror du har fat i det noget af det rigtige; at jeg skal have en tidsfaktor på.
Avatar billede Brian Moos Lindberg Praktikant
31. marts 2003 - 15:34 #8
der er sikkert andre løsninger... jeg kan bare ikke lige komme på nogen... ;-)
Avatar billede farmer Nybegynder
31. marts 2003 - 18:04 #9
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.

Mvh. Brazil...
Avatar billede farmer Nybegynder
31. marts 2003 - 18:06 #10
I dit tilfaelde, 69'er, saa saetter du en writelock foer en bruger begynder at editere, og fjerner den igen naar han lukker tabellen.

Jeg ved ikke lige, hvad der sker, hvis en bruger blot lukker browseren, men mon ikke der er en timer i laase-funktionerne i MySql.

(Jeg har kun laest om det, aldrig brugt det...)
Avatar billede farmer Nybegynder
31. marts 2003 - 18:42 #11
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.

Mvh. Anders
Avatar billede arne_v Ekspert
31. marts 2003 - 18:52 #12
MySQL syntax er:

LOCK TABLES tabelnavn WRITE;
...
UNLOCK TABLES;

så er der ikke nogen der kan opdatere imellem.
Avatar billede farmer Nybegynder
31. marts 2003 - 18:52 #13
En lille forklaring og basal tutorial:
http://www.crazygrrl.com/weav/mysql2.php3
Avatar billede stig69 Nybegynder
31. marts 2003 - 18:53 #14
arne v--> Hvad sker der hvis browservinduet lukker før unlock? Og er der en timeout??
Avatar billede arne_v Ekspert
31. marts 2003 - 19:00 #15
LOCK er på connection og bliver automatisk releaset hvis
connection forsvinder.

Det betyder imidlertid også at det er PHP der skal holde
connection mellem SELECT og UPDATE (og release hvis client
aldrig kommer tilbage).

Jeg ved desværre kun hvordan man kune lave den slags i JSP. Jeg
kender slet ikke PHP.

Så den del kan jeg ikke hjælpe med.

Men jeg formoder at PHP har et session begreb. Hvor man kan gemem data.
Og som timer ud hvis client ikke komem rtilbage.
Avatar billede andy Nybegynder
02. april 2003 - 09:53 #16
Stig, hvad mener du med "brugere"? admins der bekræfter ordre? andre surfere/kunder?
Avatar billede stig69 Nybegynder
02. april 2003 - 10:02 #17
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.

Stig
Avatar billede andy Nybegynder
02. april 2003 - 19:42 #18
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 :)
Avatar billede arne_v Ekspert
02. april 2003 - 19:48 #19
andy>

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.
Avatar billede arne_v Ekspert
02. april 2003 - 19:53 #20
stig>

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)
Avatar billede andy Nybegynder
02. april 2003 - 21:14 #21
dooh, en tanketorsk :D
Tænkte slet ikke på det sådan. Kun om om mysql ville kunne locke mellem insert og select.
Avatar billede stig69 Nybegynder
24. maj 2003 - 13:15 #22
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester