Kom ihåg mig?
Home Menu

Menu


Låsa upp en tabell i mysql så länge jag håller på att putta in data.

 
Ämnesverktyg Visningsalternativ
Oläst 2015-09-02, 08:05 #1
spyvingen spyvingen är inte uppkopplad
Medlem
 
Reg.datum: Jan 2006
Inlägg: 245
spyvingen spyvingen är inte uppkopplad
Medlem
 
Reg.datum: Jan 2006
Inlägg: 245
Standard Låsa upp en tabell i mysql så länge jag håller på att putta in data.

Har nu en sida som ligger och uppdaterar en tabell i mysql var 15:e sekund.

Har sedan en sida där jag presenterar data som uppdateras var 15:e sekund.

Sidan som hämtar har en databas öppning och den gör två sidhämtningar först hämtar den från en sida tar bort alla spår från denna sidan i data basen och sedan puttar in det nya i databasen och sedan samma sak med andra sidan.

När jag nu uppdaterar presentationssidan var 15:E sekund verkar den hämta i något mellan läge så det finns bara data från ena sidan.

Jag har alltid trott att tabellen är låst när man puttar in data men det verkar ju vara fel

Så frågan är kan jag tvinga den att vara låst medans jag hämtar data så att min presentationssida får stå i kö tills all data är uppdaterad?

Eller kan jag slå ihop allt till en enda insert på nått sätt så jag bara gör en batch med inserts istället för flera olika så att databasen skriver allt med en förfrågan eller liknande?

Kanske finns bättre sätt än de jag kommit på är inte alls så van vid mysql.
spyvingen är inte uppkopplad   Svara med citatSvara med citat
Oläst 2015-09-02, 08:45 #2
coredevs avatar
coredev coredev är inte uppkopplad
Bara ett inlägg till!
 
Reg.datum: Sep 2007
Inlägg: 1 554
coredev coredev är inte uppkopplad
Bara ett inlägg till!
coredevs avatar
 
Reg.datum: Sep 2007
Inlägg: 1 554
Jag är inte säker på att jag förstår hur din applikation fungerar gällande skriv och läsning. Men låt oss säga att funktionen som bygger upp datat består av en DELETE och en eller flera INSERT, då bör du wrappa dessa i en transaktion. Sedan kan du välja i funktionen som läser datat att OM den försöker läsa data samtidigt som den andra funktionen håller på att lägga in datat så gör den antingen:
1) Läser datat så som det såg ut innan transaktionens början
2) Väntar på att transaktionen arbetar klart och läser sedan datat så som det ser ut efter transaktionens slut

Här har du lite info om hur det fungerar i MySQL: http://dev.mysql.com/doc/refman/5.6/...ansaction.html

Disclaimer: Jag kan inte så mycket om transaction isolation i MySQL, ovan info är baserad på hur databaser brukar fungera + google-fu.
coredev är inte uppkopplad   Svara med citatSvara med citat
Oläst 2015-09-02, 08:54 #3
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
Om tabellen är låst eller inte beror på om du använder MyISAM eller InnoDB. Det kan vara bra att läsa på lite om grunderna i hur de fungerar om du vill förstå vad som händer i din databas.
__________________
Full-stack developer, free for smaller assignments
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Oläst 2015-09-02, 09:08 #4
nim nim är inte uppkopplad
Medlem
 
Reg.datum: Oct 2014
Inlägg: 248
nim nim är inte uppkopplad
Medlem
 
Reg.datum: Oct 2014
Inlägg: 248
Tabell typen MyISAM låser tabellen vid läsning & skrivning beroende på vad man gör eller vad man själv tycker ( LOCK TABLE t1 WRITE, t2 READ )


I InnoDB är detta borttaget till stordel och istället används row locking ( vilket är modernare ) och enbart drabbar dom rader man arbetar med just nu och medför snabbare datahantering.
nim är inte uppkopplad   Svara med citatSvara med citat
Oläst 2015-09-02, 09:25 #5
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
Citat:
Ursprungligen postat av nim Visa inlägg
I InnoDB är detta borttaget till stordel och istället används row locking ( vilket är modernare ) och enbart drabbar dom rader man arbetar med just nu och medför snabbare datahantering.
Nja, InnoDB är inte alltid snabbare.
__________________
Full-stack developer, free for smaller assignments
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Oläst 2015-09-02, 09:30 #6
nim nim är inte uppkopplad
Medlem
 
Reg.datum: Oct 2014
Inlägg: 248
nim nim är inte uppkopplad
Medlem
 
Reg.datum: Oct 2014
Inlägg: 248
Citat:
Ursprungligen postat av tartareandesire Visa inlägg
Nja, InnoDB är inte alltid snabbare.
Generellt sätt, jo. Sen om man går djupare så får man välja databas och databasmotor beroende på vad man ska bearbeta.

Men visst, du går säkert och köper en Volvo 740 när vill köra på autobahn.
nim är inte uppkopplad   Svara med citatSvara med citat
Oläst 2015-09-02, 10:12 #7
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
Citat:
Ursprungligen postat av nim Visa inlägg
Generellt sätt, jo. Sen om man går djupare så får man välja databas och databasmotor beroende på vad man ska bearbeta.

Men visst, du går säkert och köper en Volvo 740 när vill köra på autobahn.
Det finns inga generella fall Som du säger så får man välja lösning efter ändamål precis som med allt annat. Det är få som kör sin bil enbart på Autobahn även om det säkert finns undantag även där För den som inte vill, kan eller behöver sätta sig in i vad som är bäst för deras applikation så är InnoDB alltid det rätta valet, det kan jag däremot hålla med om (i de flesta fall annars också men inte alltid som sagt var). Annars blir det lite meningslöst att säga något i stil med att "en bil är snabbare än en båt". Ja, det beror ju på om du ska ta dig fram över vatten eller inte
__________________
Full-stack developer, free for smaller assignments

Senast redigerad av tartareandesire den 2015-09-02 klockan 10:19
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Oläst 2015-09-02, 11:19 #8
Clarence Clarence är inte uppkopplad
Administratör
 
Reg.datum: Jan 2003
Inlägg: 1 974
Clarence Clarence är inte uppkopplad
Administratör
 
Reg.datum: Jan 2003
Inlägg: 1 974
Citat:
Ursprungligen postat av nim Visa inlägg
Generellt sätt, jo. Sen om man går djupare så får man välja databas och databasmotor beroende på vad man ska bearbeta.
Generellt sett är MyISAM snabbare än InnoDB för reads. Generellt sett är webbapplikationer övervägande reads. Så oftare än inte kommer MyISAM vara snabbare än InnoDB om man inte ger sig på dumheter eller hög (blandad) last.

Men sen skulle jag ändå generellt sett rekommendera InnoDB/XtraDb/Aria snarare än MyISAM.

Ett exempel på en av många anledningar är TS fråga. Eftersom det finns transaktionsstöd och atomicity i writes så behöver man inte krångla mer än att lägga hela uppdateringen i EN transaktion och därmed alltid få senaste kompletta uppdateringen från sin select.
Clarence är inte uppkopplad   Svara med citatSvara med citat
Oläst 2015-09-02, 15:51 #9
spyvingen spyvingen är inte uppkopplad
Medlem
 
Reg.datum: Jan 2006
Inlägg: 245
spyvingen spyvingen är inte uppkopplad
Medlem
 
Reg.datum: Jan 2006
Inlägg: 245
You lost me at MyISAM och InnoDB

Jag vill gärna ha en så enkel lösning som möjligt men som klarar av att göra det jag vill.
Jag vill alltid visa förskaste datan men jag vill inte ha den uppdelad om det är så att jag hämtar sidan samtidigt som jag öppnar databasen.

Hur gör man i mysql för att lägga in flera samtidigt?
Ska jag göra flera sqlkommandon och köra in som en enda körning eller måste man tänka på något speciellt.

Är lite noob som ni förstår.
Om jag ska skicka in många samtidigt ska man separera rader med något tecken eller liknande räcker det att göra så här?
Kod:
SQL = "delete from MyTable where field1 = 'XXX'; " & _
      "INSERT INTO MyTable (Field1, Field2) VALUES ('name1', 1);" & _
      "INSERT INTO MyTable (Field1, Field2) VALUES ('name2', 2);"
Kommer detta då gör att allt kommer in på samma gång och om clienten skulle uppdatera så får den snällt vänta till det är klart?

EDIT :
Hittade även detta
Kod:
INSERT 
  INTO Table ( Col1, Col2, Col3 ) 
  VALUES
    ( Value1, Value2, Value3 ), 
    ( Value4, Value5, Value6 ), 
    ( Value7, Value8, Value9 )
Skulle kanske vara ett ännu bättre alternativ?

Senast redigerad av spyvingen den 2015-09-02 klockan 15:57
spyvingen är inte uppkopplad   Svara med citatSvara med citat
Oläst 2015-09-02, 16:38 #10
Clarence Clarence är inte uppkopplad
Administratör
 
Reg.datum: Jan 2003
Inlägg: 1 974
Clarence Clarence är inte uppkopplad
Administratör
 
Reg.datum: Jan 2003
Inlägg: 1 974
Citat:
Ursprungligen postat av spyvingen Visa inlägg
You lost me at MyISAM och InnoDB

Jag vill gärna ha en så enkel lösning som möjligt men som klarar av att göra det jag vill.
Jag vill alltid visa förskaste datan men jag vill inte ha den uppdelad om det är så att jag hämtar sidan samtidigt som jag öppnar databasen.

Hur gör man i mysql för att lägga in flera samtidigt?
Ska jag göra flera sqlkommandon och köra in som en enda körning eller måste man tänka på något speciellt.

Är lite noob som ni förstår.
Om jag ska skicka in många samtidigt ska man separera rader med något tecken eller liknande räcker det att göra så här?
Kod:
SQL = "delete from MyTable where field1 = 'XXX'; " & _
      "INSERT INTO MyTable (Field1, Field2) VALUES ('name1', 1);" & _
      "INSERT INTO MyTable (Field1, Field2) VALUES ('name2', 2);"
Kommer detta då gör att allt kommer in på samma gång och om clienten skulle uppdatera så får den snällt vänta till det är klart?

EDIT :
Hittade även detta
Kod:
INSERT 
  INTO Table ( Col1, Col2, Col3 ) 
  VALUES
    ( Value1, Value2, Value3 ), 
    ( Value4, Value5, Value6 ), 
    ( Value7, Value8, Value9 )
Skulle kanske vara ett ännu bättre alternativ?
Det lättaste vore att se till att tabellen är av typen InnoDB (förutsatt att du använder vanilla MySQL, annars kan den heta annorlunda men ändå i princip vara samma motor). Isåfall startar du en transaktion innan du kör din delete query, och avslutar den efter du är klar med dina inserts. På så sätt kommer dina läsningar av datan alltid få senaste avslutade uppdateringen oavsett om din uppdatering precis har tagit bort massa rader och ännu inte hunnit lägga in något så kommer det synas först när transaktionen är avslutad (committad).

Byt till InnoDB:
Kod:
ALTER TABLE table_name ENGINE=InnoDB;
Uppdatering pseudo-kod (använder du verkligen VB!?!):
Kod:
Db->beginTransaction()
// Alla db queries
Db->commitTransaction()
Därefter syns resultatet inte förräns allt mellan begin och commit är färdigt, under tiden kommer det (normalt sett) den uppdaterade datan endast vara synlig för processen/transaktionen själv.
Clarence är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 10:40.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017