Szerző |
Üzenet |
Hardhead
vas-tag
Csatlakozott: szer. márc. 24, 2004 13:43 Hozzászólások: 8
|
Köszi!
Azért mindig lehet tanulni valamit
Üdv!
|
pén. aug. 08, 2003 17:27 |
|
|
DoBa
vas-tag
Csatlakozott: szer. márc. 24, 2004 13:43 Hozzászólások: 3
|
update tabla set mezo = if (mezo = 0, 1,0);
(MySQL)
|
pén. aug. 08, 2003 17:14 |
|
|
Hardhead
vas-tag
Csatlakozott: szer. márc. 24, 2004 13:43 Hozzászólások: 8
|
Sziasztok!
Köszönöm a hozzászólásokat.
A határidő nagy úr, ugyhogy meg kellett oldanom a dolgot.
Meg kell mondanom, hogy a lockolás bennem is felmerült,
de nem akartam élni vele. Mivel PHP-ban használom ami egy
script progi. Nem szeretnék úgy járni, hogy valami nem várt hiba miatt a lockolás alatt valamilyen hiba miatt
leáll a script és azon túl senki nem tud hozzáférni az
adatbázishoz (vagy egy részéhez). Ugyhogy ezt mellőztem.
A megoldás a következő lett:
SELECT elsőre kizárva. A már felmerült késlekedési probléma miatt.
Helyette UPDATE a megfelelő feltételt megadva.
Ahogy azt gixx is tirta
" UPDATE táblanév SET azabizonyosmezö=0 WHERE azabizonyosmezö=1( AND további feltételek.)"
Nekem még annyi hozzájött, hogy " LIMIT 1",
ugyanis mindig csak 1 rekordot szeretnék módosítani.
Ezenkívűl: az UPDATE mindig beleír egy egyedi infot a rekordba.
Mivel az UPDATE után meg lehet tudni, hogy az UPDATE
hány rekordot érintett, így nem kell a SELECT.
Amenyniben az érintett rekordok száma >0 akkor
volt olyan rekord ami a feltételnek elegett tett.
Mivel az UPDATE során bevittünk a rekordba egy
egyedi mezőértéket is, ennek alapján visszakereshető
az adott rekord.
Köszönöm mindenkinek aki segíteni próbált!
Üdv!
|
hétf. aug. 04, 2003 16:06 |
|
|
boj
Csatlakozott: szer. márc. 24, 2004 13:43 Hozzászólások: 0
|
esetleg egy subselectes update-t csinálj, de nézd meg, az általad használt dbkezelő ebben az esetben a többieknek mit enged az adott táblá(ko)n.
|
pén. aug. 01, 2003 12:50 |
|
|
boj
Csatlakozott: szer. márc. 24, 2004 13:43 Hozzászólások: 0
|
az a gond, hogy nagyobb mennyiségü rekordnál és párhuzamos irásoknál már adóhat ezzel a módszerrel is gond, mint ezt Hardhead irta is.
ha teheted, válts át postgre-re. a pg zárolásban némileg:p többet nyújt:
http://www.postgresql.org/docs/7.3/static/sql-lock.html
|
pén. aug. 01, 2003 11:03 |
|
|
gixx
Csatlakozott: szer. márc. 24, 2004 13:43 Hozzászólások: 0
|
UPDATE táblanév SET azabizonyosmezö=0 WHERE azabizonyosmezö=1( AND további feltételek.)
Valami ilyesmire gondoltál?
|
csüt. júl. 31, 2003 22:31 |
|
|
boj
Csatlakozott: szer. márc. 24, 2004 13:43 Hozzászólások: 0
|
a lockolásokról itt vannak részletek (rövidben: innodb táblán tudsz sort lockolni)
http://www.mysql.com/doc/en/Locking_methods.html
a tranzakciókban résztvevő táblatipusok és módok pedig itt:
http://www.mysql.com/doc/en/ANSI_diff_Transactions.html
|
csüt. júl. 31, 2003 16:09 |
|
|
Sweetchack77
Csatlakozott: szer. márc. 24, 2004 13:43 Hozzászólások: 0
|
A MySQL-ben használatos tábla tipusok nem mindegyike képes a tranzakciók kezeléslére.
Szerintem rekordok zárolása sem lehtséges, csak egész táblák-é.
Azt azért el kell mondjam hogy én 3 féle SQL mondatot használok SELECT; INSERT; UPDATE;
de a SELECT-hez már inkább varázslókat használok.
KB ennyit értek az adatbázishoz.
|
csüt. júl. 31, 2003 0:13 |
|
|
boj
Csatlakozott: szer. márc. 24, 2004 13:43 Hozzászólások: 0
|
lockold azt a rekordot addig, igy biztos. nézd meg, tranzakciókezelésre milyen lehetőségek vannak a mysqlben, ezzel még egyszerüsithetsz a dolgon. (ha összetettebb a dolog)
|
csüt. júl. 31, 2003 0:04 |
|
|
Sweetchack77
Csatlakozott: szer. márc. 24, 2004 13:43 Hozzászólások: 0
|
Én SQL-hez nem nagyon értek,
Viszont van egy nagyon **** könyvem hozzá.
LOCK TABLE <táblaneve> IN {SHARE|EXCLUSIVE} MODE;
UNLOCK TABLE táblaneve;
A LOCK TABLE utasítással lehet egy táblázat zárolását kezdeményezni. a SHARE kulcsszó hatására egyidajüleg több felhasználó számára lehetővé válik a táblázat lekérdezése, de módosítása nem. Az EXCLUSIVE kulcsszó használatával a táblázatot a zárolást kezdeményező kizárolagos használatába vonja és felújítási müveletek is végrehajthat rajta.
Itt az idézet nem folyamatokról hanem felhasználokról beszél. Egy weboldal esetén ugyan olyan felhasználói névvel kapcsolodik minden folyamat.
Ha müködik folyamatokra akkor minden OK, de ha nem akkor megoldás lehet az hogy létre hozni még egy usert az adatbázishoz, és amikor zárolásra van szükség akkor MySQL_Change_User(), elvégezni a kivánt müveleteket, a zárolás feloldása, vissza jelentkezni.
A teszteléshez sok siker kivánok.
|
csüt. júl. 31, 2003 0:04 |
|
|
Hardhead
vas-tag
Csatlakozott: szer. márc. 24, 2004 13:43 Hozzászólások: 8
|
Egy alkalmazásban kell megoldanom, hogy egy sort frissítsek az adatbázisban, ha az adott rekord bizonyos mezeje mondjuk 1 akkor legyen 0. Egyébként ne tegyen semmit.
SELECT -el ugye nem vizsgálhatom, mert mire vissza updatelem addigra lehet, hogy egy másik taszk közben megvizsgálja és még 1-et talál benne holott a másik szál már épp felül akarja írni.
Kérdésem az, hogy miképpen tudom korrektűl updatelni az adott rekordot, hogy tudja azt is, hogy történt -e update, ugyanakkor más taszk már elméletileg se tudja ugyanezt megtenni.
Köszönnöm!
|
szer. júl. 30, 2003 21:06 |
|
|