Avatar billede lone_a_p Praktikant
15. marts 2004 - 13:55 Der er 18 kommentarer og
1 løsning

Fejl ved mysql_query

Hej Eksperter,

Jeg får følgende fejl:
mysql_query(): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

Det ser ud som om fejlen opstår, når man er flere brugere på sitet, hvis det kan hjælpe til løsningen.

Det er blot en "WARNING", men jeg vil meget gerne have at vide, hvad denne fejl egentlig betyder. Har forsøgt at søge på nettet, men uden held.

Fejlen opstår når jeg prøver at bruge LOCK TABLES ...

Spørgsmål: hvad betyder fejlen, og hvad gør jeg for at undgå den...???

Mvh Lone
Avatar billede lone_a_p Praktikant
15. marts 2004 - 13:56 #1
PS. Databasen ligger på en linux-server
Avatar billede muddi Praktikant
15. marts 2004 - 15:36 #2
Har du brugt LOCK TABLES inden du fik fejlen? Tabellen bliver jo låst, og så kan du ikke samtidig køre forespørgsler fra andre threads end den ene, der låste tabellen.
Avatar billede lone_a_p Praktikant
15. marts 2004 - 15:38 #3
Jeg får fejlen ved denne kommando:

mysql_query("LOCK TABLES t1 READ, t2 READ, t3 READ");
Avatar billede Slettet bruger
15. marts 2004 - 15:40 #4
Ja, og hvis en anden bruger prøver at læse samme tabel, mens der allerede er en bruger, der ser en side, der har låst tabellen, så kommer den fejl.

Er du sikker på, at du har brug for at låse tabellerne?
Avatar billede lone_a_p Praktikant
15. marts 2004 - 15:44 #5
Det er vel den mest sikre måde for at holde tabellerne intakte er det ik?

Ellers kan der jo komme en ændring ind imellem 2 queries, og man vil måske ikke få det korrekte resultat.

Vil det være sådan, at kommandoen (mysql_query("LOCK... osv)) vil blive sat på stand-by indtil den anden bruger er færdig med at arbejde på tabellen? Det er jeg nemlig noget i tvivl om...
Avatar billede muddi Praktikant
15. marts 2004 - 15:57 #6
Jamen hvad er det for en forespørgsel du har tænkt dig at køre, hvor ingen ændringer må være sket i databasen?
Jeg har personlig aldrig brugt det til andet end replikation.
Avatar billede lone_a_p Praktikant
15. marts 2004 - 16:03 #7
f.eks. hvis du har både bruger og admin

En bruger (eller koden dertil) tæller op i en tabel:
- Hvor mange rækker der er i tabellen i alt
- Hvor mange rækker der er i tabellen der har "Y" i en bestemt kolonne
- Hvor mange rækker der er i tabellen der har "Y" i en anden bestemt kolonne

Her gå admin så ind og tilføjer et produkt indimellem.
Så giver det problemer - det kan da ske i masser af tilfælde. Jeg ved godt at de ikke vil ske ret tit, men jeg vil afluse denne "ikke ret tit" til aldrig.

Det SKAL kunne lade sig gøre, ellers fandtes det vel ikke - og der er jo en god mening med at bruge det.
Avatar billede muddi Praktikant
15. marts 2004 - 16:11 #8
Jamen brugeren vil jo blot have fået sit resultat. Hvordan har brugeren adgang til databasen? Er det via en hjemmeside eller et program?

Hvis brugeren kun har adgang til databasen gennem en hjemmeside, så vil hans forespørgsel jo blot blive besvaret. Sker der så ændringer vil han først få dem vist når han reloader siden i sin browser. Når siden så indlæses igen, så vil det nye produkt blive vist.

Hvilken type db har du oprettet? MyISAM, BDB, ...?

Selvfølgelig kan det lade sig gøre, men der er ikke grund til at låse tabellerne i tide og utide, hvis det kan undgås.
Avatar billede lone_a_p Praktikant
15. marts 2004 - 16:15 #9
Type: MyISAM

Nej, du skal forestille dig at de 3 forespørgsler sker på samme site, så vil det rigtige resultat ikke komme ud, for netop hvis tabellerne ikke er låst kan en anden person gå ind og påvirke tabellerne indimellem de f.eks. 3 jeg har skrevet 2 kommentarer oppe.
Avatar billede muddi Praktikant
15. marts 2004 - 16:20 #10
Det er rigtigt, men hvor mange brugere regner du med at have? og hvor mange opdateringer?
Chancen for at det skulle gå galt vil sandsynligvis være forsvindende lille.
En anden ting der er værd at overveje er, hvor galt det vil gå, hvis det skulle ske. Altså om det går ud over database-integriteten, eller om der blot mangler et produkt i e-handlen, som tilmed vil blive vist, så snart brugeren har trykket på et link...
Avatar billede muddi Praktikant
15. marts 2004 - 16:23 #11
Bruger du den samme thread til både LOCK og UNLOCK? Eller sker det via forskellige tråde? Du skal jo huske at bruge den samme forbindelse, så måske du skulle overveje en persistent connection, for at kunne bruge den samme tråd igen.
Avatar billede muddi Praktikant
15. marts 2004 - 16:26 #12
Det her var hvad der stod i manualen, "The main reasons to use LOCK TABLES are for emulating transactions or getting more speed when updating tables."

Der stod også følgende, "If a thread obtains a READ lock on a table, that thread (and all other threads) can only read from the table. If a thread obtains a WRITE lock on a table, only the thread holding the lock can read from or write to the table. Other threads are blocked."

Du skal måske bruge en WRITE lock i stedet. Du har jo netop tænkt dig at opdatere indholdet ikke sandt?
Avatar billede lone_a_p Praktikant
15. marts 2004 - 16:28 #13
samme thread ... ja, det gør jeg vel, det er i samme script...

Men en anden (i en anden tråd) kan jo godt ske at forsøge at låse tabeller der er låst.

Jeg ved ikke hvad en persistent connection er? Vil du forklare?

Jeg har styr på READ og WRITE, men det er blot i nævnte tilfælde der skulle stå READ. Og jeg har læst manualen, men der står ikke noget om mit spørgsmål.
Avatar billede muddi Praktikant
15. marts 2004 - 16:45 #14
Hmm... en persistent connection er en forbindelse, har ikke så meget med databasen at gøre, men mere med det program/sprog du bruger til at oprette forbindelse.
I php bruger man f.eks. mysql_pconnect()-funktionen i stedet mysql_connect()-funktionen.
Det resource link der så bliver skabt, er gældende for den thread, og de lukkes først når du beder om det. F.eks. med mysql_close($link_id).
Avatar billede lone_a_p Praktikant
15. marts 2004 - 16:49 #15
Det skal jeg vist have kigget på hvad er ...

Har desværre ikke mere tid lige nu, men vender tilbage til dette spørgsmål ...
Avatar billede muddi Praktikant
01. april 2004 - 16:11 #16
lone >> Hvad har du fundet ud af? Virker det?
Avatar billede lone_a_p Praktikant
01. april 2004 - 16:20 #17
muddi > Nej desværre, men er stadig meget interesseret i nye bud på problemet.
Avatar billede lone_a_p Praktikant
02. juli 2004 - 11:51 #18
Det virker nu - ved ikke helt hvorfor?! ... men muddi får point for arbejdet :o)
Avatar billede muddi Praktikant
02. juli 2004 - 12:00 #19
Jamen jeg takker ;)
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

IT-JOB