FAQ |
Kalender |
Ämnesverktyg | Visningsalternativ |
![]() |
#1 | ||
|
|||
Medlem
|
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. |
||
![]() |
![]() |
![]() |
#2 | |||
|
||||
Bara ett inlägg till!
|
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. |
|||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Supermoderator
|
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 |
||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Medlem
|
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. |
||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Supermoderator
|
Nja, InnoDB är inte alltid snabbare.
__________________
Full-stack developer, free for smaller assignments |
||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Medlem
|
|||
![]() |
![]() |
![]() |
#7 | ||
|
|||
Supermoderator
|
Citat:
![]() ![]() ![]()
__________________
Full-stack developer, free for smaller assignments Senast redigerad av tartareandesire den 2015-09-02 klockan 10:19 |
||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Administratör
|
Citat:
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.
__________________
eldefors.com - Personlig (teknik)-blogg |
||
![]() |
![]() |
![]() |
#9 | ||
|
|||
Medlem
|
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);" EDIT : Hittade även detta Kod:
INSERT INTO Table ( Col1, Col2, Col3 ) VALUES ( Value1, Value2, Value3 ), ( Value4, Value5, Value6 ), ( Value7, Value8, Value9 ) Senast redigerad av spyvingen den 2015-09-02 klockan 15:57 |
||
![]() |
![]() |
![]() |
#10 | ||
|
|||
Administratör
|
Citat:
Byt till InnoDB: Kod:
ALTER TABLE table_name ENGINE=InnoDB; Kod:
Db->beginTransaction() // Alla db queries Db->commitTransaction()
__________________
eldefors.com - Personlig (teknik)-blogg |
||
![]() |
![]() |
Svara |
|
|