Stránka 1 z 1
MySQL a transakce
Napsal: sob 15. zář 2012, 00:37
od arxeiss
Zauvažoval jsem, že by nebylo špatné při složitějších operacích s DB, které v nynějším projektu jsou, použít transakce, bohužel jsem samouk a o transakcích jsme se nebavili ve škole, takže vím prd...
Přečetl jsem 2 články
MySQL(41) a
MySQL(42) na linuxsoftu, tak jsem pochopil k čemu jsou atd.
Ale stále si nejsem jist jednou věcí, když vložím do DB nového žáka, pomocí mysql funkce v PHP si vytáhnu poslední vložené ID, které potřebuju k akci v dalších 2 dotazech. Co na to transakce? vrátí mi nějaké ID, které při potvrzení transakce na 100% dostanu, tudíž není problém? Nebo u toho problém může nastat?
Re: MySQL a transakce
Napsal: sob 15. zář 2012, 07:42
od pepak.net
U databází, které pracují na bázi autoincrementu (např. právě MySQL, ale také MSSQL) je to obvykle ošetřeno tak, že funkce pro vrácení posledního ID pracuje v rámci transakce nebo připojení (když transakce nejsou [MySQL u MyISAM databází] nebo se používá autocommit).
U "normálních" databází se ID vytváří generátorem (sekvencí), který je mimo transakční a ID se z něj vytáhne předtím, než se začne zakládat nový záznam.
Re: MySQL a transakce
Napsal: sob 15. zář 2012, 08:52
od arxeiss
Tudíž, je to v pořádku, a můžu to používat. Jenom u MySQL nesmím používat MyISAM?
Když jsem totiž kdysi viděl tabulku všech těch úložišť v MySQL tak tam bylo, že InnoDB uzamyká i jednotlivé řádky, zatímco MyISAM celé tabulky, tudíž i u MyISAM by transakce měly být funkční.
A jěště dotaz, co se stane, když by 2 lidé ve stejný okamžik chtěli, v mém případě, přidat žáka. Já začnu transakci, a někdo druhý další. Tak mu to spadne, vyhodí DB error, nebo se to zařadí do řady? Toto jsem totiž taky z výše zmíněných článků nepochopil. On tam píše jak se to dá řešit, ale ne jak se to řeší...
Re: MySQL a transakce
Napsal: ned 16. zář 2012, 14:22
od pepak.net
arxeiss píše:Tudíž, je to v pořádku, a můžu to používat. Jenom u MySQL nesmím používat MyISAM?
Ano, IMHO.
Když jsem totiž kdysi viděl tabulku všech těch úložišť v MySQL tak tam bylo, že InnoDB uzamyká i jednotlivé řádky, zatímco MyISAM celé tabulky, tudíž i u MyISAM by transakce měly být funkční.
Transakce se zamykáním nijak nesouvisí a zamykání s transakcemi taky ne.
jěště dotaz, co se stane, když by 2 lidé ve stejný okamžik chtěli, v mém případě, přidat žáka.
To by neměl být problém - jak generátory, tak autoincrement jsou mimotransakční, takže to bude fungovat (za předpokladu, že RDBMS správně vrací použité ID). Akorát nesmíš počítat s tím, že "požádal jsem si první, tak dostanu nižší ID" - to splněno být nemusí. (Což je ostatně důvod, proč, když už používám databázi stojící na autoincrementech, mám používat její funkce pro vrácení použitého ID a ne extra volání typu SELECT MAX(id) FROM tabulka).
Re: MySQL a transakce
Napsal: ned 16. zář 2012, 19:04
od arxeiss
pepak.net píše:Transakce se zamykáním nijak nesouvisí a zamykání s transakcemi taky ne.
Aha, já právě myslel, že to zamykání je to, že někdo spustí transakci tak aby mu to někdo neměnil pod rukama, tak se tabulka zamkne.
Díky moc za osvětlení...
Re: MySQL a transakce
Napsal: ned 16. zář 2012, 20:22
od W3N4
Transakce se zamykanim samozrejme souvisi. Jinym zpusobem se neda docilit izolovanosti transakce (ACID).
Re: MySQL a transakce
Napsal: ned 16. zář 2012, 20:43
od pepak.net
arxeiss píše:pepak.net píše:Transakce se zamykáním nijak nesouvisí a zamykání s transakcemi taky ne.
Aha, já právě myslel, že to zamykání je to, že někdo spustí transakci tak aby mu to někdo neměnil pod rukama, tak se tabulka zamkne.
Jasně, i tak se dají transakce implementovat. Ale jde to i bez zamykání, a naopak, zamykání se dá používat i bez transakcí.
W3N4 píše:Transakce se zamykanim samozrejme souvisi. Jinym zpusobem se neda docilit izolovanosti transakce (ACID).
LOL, to jistě. Asi bys měl například všem multigeneračním databázím říct, že neexistují.
(To "I" říká, že transakce, jsou izolované. Ne, že se té izolace musí dosahovat zamykáním a nikdy jinak.)
Re: MySQL a transakce
Napsal: ned 16. zář 2012, 22:36
od W3N4
Nechapu, co na me reakci shledavas tak vtipne.
Kazdopadne, ja reaguju na tvoje prohlaseni, ze zamykani s transakcemi nijak nesouvisi, coz neni pravda - jedna z veci, kterou se problematika okolo transakci zabyva, je izolace a tedy i zamykani dat v databazi.
Asi bys měl například všem multigeneračním databázím říct, že neexistují.
Teto reakci nerozumim.
(To "I" říká, že transakce, jsou izolované. Ne, že se té izolace musí dosahovat zamykáním a nikdy jinak.)
Samozrejme. Ale ciste ze zvedavosti, znas nejaky jiny zpusob, jak docilit izolace transakce (na libovolne urovni)?
Mozna ze chces spis rict, ze transakce nemusi zamykat data, aby to byla porad transakce.
Re: MySQL a transakce
Napsal: pon 17. zář 2012, 19:53
od arxeiss
Jěště jeden dotaz.
Mám napsaný začátek transakce, nějaké ty dotazy SELECT, INSERT, UPDATE, pokud by náhodou během nich došlo k chybě, ať už mojí blbostí a PHP skript zkončí, nebo jiným zaviněním, tak se všechny předchozí příkazy stornujou jak zkončí připojení k DB?
Díky
Re: MySQL a transakce
Napsal: pát 21. zář 2012, 18:36
od arxeiss
No tak jsem si to vyzkoušel sám, a čeká to, ale pokud se úprava netýká řádku který je upravován druhou transakcí, tak se to provede, mají to opravdu dobře vymyšlené.
Jde mi ale o jiný problém, abych to neřešil teoreticky tak popíšu přímo můj problém přímo jak je.
Dělám systém pro registrování žáků na lyžařské kurzy, každý kurz má ovšem omezený počet členů, tudíž já zjistím, zda-li již registrovaných členů je tolik kolik je kapacita nebo dokonce více. Tuto hodnotu pak uložím při vkládání žáka do tabulky, a později podle ní jěště odesílám email.
Jde mi o to, že pokud začnu transakci, vložím žáka. Začnu druhou transakci a spočtu počet řádků, tak mi to stále vrátí starou hodnotu. Na jednu stranu je to logické, na druhou ne, protože pak se může stát, že než já dokončím transakci, tak druhý klient vkládá dalšího, ale spočteno je furt volné místo, a nastane problém, že 2 žáci budou přihlášeni, i když jeden z nich by být neměl..
Máte nápad jak toto vyřešit?
díky
Re: MySQL a transakce
Napsal: úte 25. zář 2012, 16:33
od Joži
staviaš systém, kde takáto situácia nastane raz za 100 rokov, resp. riešiš problémy, ktoré ani nemáš