| MySQL SELECT in UPDATE v istem SQL stavku | ||
|---|---|---|
| kljuka12. sep 2011 20:04:36Pridružen od: 26. feb 2008 4 objave +100 | #1Ali kdo pozna način, kako iz MySQL baze podatkov najprej izbrati vrstico in jo v istem hipu update-ati. Nekaj takega kot spodaj, a le v enem stavku: SELECT * FROM ... LIMIT 1;Ozadje: verjetno je to ena najpogostejših operacij: izbereš vrstico, ki jo boš posodabljal in jo označiš kot "zasedeno" - ki se update-a. Naslednji, ki izbira vrstico za posodobljati ne sme izbrati iste, ker se ta že posodablja. Težava: Če 2 uporabnika(programa) istočasno izbirata vrstico, ki jo bosta posodabljala, bosta oba izbrala isto (ker je noben še ne uspe UPDATE-ati kot zasedeno). Kako rešiti zgornji problem v MyISAM bazi podatkov? Hvala za vse nasvete nazadnje urejal kljuka 12. sep 2011 20:06:06 všeč(0)ni všeč(0)spam(0) | |
| Gogy12. sep 2011 20:19:23Pridružen od: 17. mar 2007 1575 objav +1118-1718 | #2ponavadi delaš tako UPDATE imetabele tab1Se pravi, narediš stavek UPDATE, kličeš pa določen SELECT za neko polje. Ti to reši problem prve težave? všeč(0)ni všeč(0)spam(0) | |
| Tody12. sep 2011 20:45:36Pridružen od: 3. maj 2010 672 objav +635-1398 | #3Zakaj bi dva hkrati updatala isto tabelo (v tisočinko hkrati?) takoj ko nekdo da update na tabelo in vrstico se ta ohrani v seji. Drugemu pa pa reče da ni možno updatat zaradi tega ali onega razloga. Pozna se šele potem ko prvi da commit. Je pa res da je to iz Oracla vrjetno je tudi tukaj dosti podobno. Tam bi to rešil z pl/sql vrjetno se da tukaj rešit to s kakim php-jem? všeč(0)ni všeč(0)spam(0) | |
| Packac12. sep 2011 20:46:36Pridružen od: 7. sep 2011 3 objave 000 | #4Če imaš v tej tabeli nek indikator uporabnika (ali seje, ...), lahko narediš npr. UPDATE pred INSERT: UPDATE SET updating=1,updater=@1234 WHERE updater=NULL,... SELECT WHERE updating=1 AND updater@1234, ... Drugače pa uporabi zaklepanje pred pisanjem na celotni tabeli (LOCK TABLES). MyISAM, če se ne motim, ne podpira zaklepanja na nivoju vrstice. [EDIT]: Tist updating me moti, zaradi "ing". Če izvajaš več poizvedb, ki so odvisne med seboj nujno s transakcijo. nazadnje urejal Packac 12. sep 2011 20:53:03 všeč(0)ni všeč(0)spam(0) | |
| kljuka12. sep 2011 22:16:47Pridružen od: 26. feb 2008 4 objave +100 | #5 UPDATE imetabele tab1Gogy: kako s tem pridobim tudi vsebino vrstice, ki jo bom update-al? Bistvo je, da označim vrstico, ki jo bom posodobil, nato pa to vrstico preberem (da jo lahko začnem obedlovati) Zakaj bi dva hkrati updatala isto tabeloTody: gre za design: ne sme obstajati opcija, da 2 izbereta isto vrstico in jo sočasno posodabljata. Če imaš v tej tabeli nek indikator uporabnika (ali seje, ...), lahko narediš npr. UPDATE pred INSERT:Packac: tvoja rešitev reši problem, a precej zakomplicira zadevo, ker je potrebno identificirati updater-je in dodati novo polje v tabelo. Ideja s transakcijami mi je najbolj všeč. Ali MySQL z MyISAM omogoča transakcije? Pa ne sme se zgoditi, da je v času transakcije tabela zaklenjena, ker potem vsi procesi čakajo, kar vodi v ... vedno daljše vrste in kolaps sistema. všeč(0)ni všeč(0)spam(0) | |
| Tody13. sep 2011 00:00:27Pridružen od: 3. maj 2010 672 objav +635-1398 | #6naroben topic :) nazadnje urejal Tody 13. sep 2011 00:01:20 všeč(0)ni všeč(0)spam(0) | |
| Packac13. sep 2011 00:24:52Pridružen od: 7. sep 2011 3 objave 000 | #7Smo zakompliciral. Dejansko je OK tako kot imaš nastavljen updating stolpec in s tem lahko implementiraš "row lock". UPDATE ... SET `updating`='1 WHERE updating<>1 Potem pa pogledaš affected rows. Ja, MyISAM ne podpira transkakcij. všeč(0)ni všeč(0)spam(0) | |
| krho13. sep 2011 08:05:30Pridružen od: 7. jul 2011 58 objav +26-41 | #8od 5.0 naprej imaš SELECT x FOR UPDATE... če se ne motim pa zadeva deluje samo na innodb, ker myisam ne podpira row lockinga všeč(0)ni všeč(0)spam(0) www.pagein.si | www.nadzornaplošča.si - Kvalitetno, zanesljivo in cenovno ugodno gostovanje elektronskih poštnih predalov. | |
stran 1 od 1 |<<1>>| | ||
