MySql tranzakció.
Sziasztok!
A prog.hu-n olvastam egy érdekes topicot mysql lock table és mysql lock row témában, és ott láttam a következő kifejezést:
...indítok egy tranzakciót...
Tudna valaki egy MySql tranzakció alapok (akár angolul) tutorialt?
Köszike: s_volenszki
ps.:
Guglit csavargattam, de nem találtam konkrét példát, és én audio-vizuális típus vagyok! :)
■ A prog.hu-n olvastam egy érdekes topicot mysql lock table és mysql lock row témában, és ott láttam a következő kifejezést:
...indítok egy tranzakciót...
Tudna valaki egy MySql tranzakció alapok (akár angolul) tutorialt?
Köszike: s_volenszki
ps.:
Guglit csavargattam, de nem találtam konkrét példát, és én audio-vizuális típus vagyok! :)
link a mysql tranzakcio+innoDB-hez
tutorial
s_volenszki
Találtam már több topikot,
Szóval van egy 'nested-tree' típusú adatmodellem, melyben tagokat lehet regisztrálni szépen egymás alá. Amíg csak egy regisztrátor van, addig minden rendben van.
Ha azonban egy időben már többen szeretnének regelni, akkor részben a 'nested-tree' logikája miatt, részben pedig, hogy a regisztráció több sql parancsból áll, szeretném az érintett táblákat lockolni és a regisztráció folyamatát tranzakcióba foglalni.
Sajnos már a lock-oláson elvéreztem :(.
Sql parancs a következő volt:
LOCK TABLE felhasznalo_struktura READ melyet kiadtam, a struktura_1.php fájlban.
Egyik böngészőben betöltöttem azt az oldalt, mely a struktura_1.php tölti be, és nem tudott létrejönni a fastruktúra. Eddig jó!
Egy másik böngészőben pedig betöltöttem egy olyan oldalt ami a struktura_2.php-t húzza be, amely szintén ua-t a lockolt táblát használja. Ennek ellenére létre tudott jönni a fastruktúra. Ez már nem jó!
Kérdésem, hogy ez normális e? Ha igen, akkor miért, és hogy valósítható meg az amit szeretnék, azaz egy LOCK TABLE kiadása után egyik php kód se férhessen hozzá az adott táblához?
Ja, és UNLOCK nélkül, a LOCK parancs eltávolítása a programkódból mellett ismét újra olvashatóvá vált a tábla. Nem értem... nem kellene előbb unlockolni???
Szóval semmit nem értek :( egy kis segítség jó lenne!
Köszönöm!
Kapcsolat
Asszem értem mit mondasz, de
De akkor megkérdem másképp is: ha tranzakciót indítok, akkor az összes érintett tábla automatikusan zárólódik amig a trancakció végig nem fut?
Amíg fut
Amíg a PHP kódod fut, addig semelyik másik lekérdezést nem lehet rajta végrehajtani. Tegyük fel, hogy a PHP kódod elején lezárod a táblát. Majd a PHP kódod fut 10 másodpercig. Ezalatt az idő alatt nem lehet lekérdezést intézni a táblához. Tehát ha ezzel párhuzamosan futna mondjuk még egy PHP szkript (tehát az alatt a 10 másodperc alatt amíg a másik szkript lefoglalta a táblát), akkor addig az vagy várakozik vagy pedig figyelmeztetéssel elszáll.
Ez részben igaz. Van olyan ami olvasásra, van, ami írásra zárolódik, ezt az adatbázismotor a lekérdezések alapján eldönti. De érdemesebb erről elolvasni a dokumentációt.
Most már okosabb lettem,
Sajnos nem boldogulok :( Ez
Van két php fájl, ebből az egyik a tranz.php:
mysql_query("SET AUTOCOMMIT=0");
mysql_query("begin");
mysql_query("select tartalom from hirek limit 3 order by idhirek")
while(mysql_query_fetch()) {
$temp[] = $row->tartalom;
}
for($c=0;$c<3;$c++){
mysql_query("UPDATE hirek set tartalom = '$temp[$c]' WHERE idhirek = $c");
sleep(5);
}
mysql_query("end");
És a másik, list.php:
mysql_query("select tartalom from hirek limit 3")
while(mysql_query_fetch()) {
echo = $row->tartalom;
}
Elindítom a tranz.php-t, melynek a futási ideje kb. 15s de ezalatt, ha egy másik böngészőben meghivom a list.php, akkor az gond nélkül lefut.
Pedig én az szeretném, hogy ne férjen addig hozzá senki az adott táblához, amíg egy update fut rajta. Ez tök alap dolog lenne, mégsem tudom megcsinálni.
Az is érdekelne még, hogy ha egy tranzakción belül több update van több különböző táblán, akkor a 'begin' után az összes tábla zárolódik vagy csak az ahol éppen a tranzakció tart. Én azt szeretném hogy az összes zárolódjon, mind írásra, mind olvasásra.
Ha egy kis példával valaki tudna segítani az nagyon jó lenne. Köszönöm!
Tranzakció fut
COMMIT
-ot akkor indul a tranzakció. Azaz amit előtte csinálsz azzal csak a tranzakciót készíted elő. És persze PHP műveleteket se csinálj a tranzakcióban, elvégre pont az a lényege a tranzakciónak, hogy az elejétől a végéig a MySQL-é a vezérlés. Van rengeteg példa az előbb említett linken is. Például:Amit te írtál ott a tranzakció az
end
utasítás kiadásakor indul, addig csak előkészítetted a tranzakciót, és még jót is aludtál közben. Amennyibensleep
-elgetni akarsz, akkor használjLOCK
-ot.Nagyon jó!
És csak akkor, hogy tényleg jól értem: ha updete-elem a hirek és például még a cikkek táblást a START és COMMIT között akkor a start után, MINDKÉT TÁBLA EGYIDŐBEN válik elérhetetlenné futás közben mind irásra és olvasásra egyaránt más folyamatok számára? Azaz 'nem kell megvárni' amíg az első update végrehajt 100.000 módosítást a hírek tblán és csak azután 'zárolja' a cikkek táblát?