MySQL a transakce

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
Odpovědět
arxeiss
Začátečník
Začátečník
Uživatelský avatar
Registrován: 19. črc 2008
Bydliště: Krmelín (předměstí Ostravy)
Kontaktovat uživatele:

MySQL a transakce

Příspěvek 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?
PC : CPU: C2D E5200 2500Mhz @ 3750Mhz a AC Freezer 7PRO MB: Gigabyte GA-P31-DS3L rev.2,1 GPU: ATI Radeon 3650HD 256MB RAM: A-Data Vitesta 2x2GB Zdroj: Forton OEM 400W HDD: Samsung F2 500GB
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
pepak.net
Začátečník
Začátečník
Registrován: 14. srp 2006

Re: MySQL a transakce

Příspěvek 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.
arxeiss
Začátečník
Začátečník
Uživatelský avatar
Registrován: 19. črc 2008
Bydliště: Krmelín (předměstí Ostravy)
Kontaktovat uživatele:

Re: MySQL a transakce

Příspěvek 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ší...
PC : CPU: C2D E5200 2500Mhz @ 3750Mhz a AC Freezer 7PRO MB: Gigabyte GA-P31-DS3L rev.2,1 GPU: ATI Radeon 3650HD 256MB RAM: A-Data Vitesta 2x2GB Zdroj: Forton OEM 400W HDD: Samsung F2 500GB
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
pepak.net
Začátečník
Začátečník
Registrován: 14. srp 2006

Re: MySQL a transakce

Příspěvek 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).
arxeiss
Začátečník
Začátečník
Uživatelský avatar
Registrován: 19. črc 2008
Bydliště: Krmelín (předměstí Ostravy)
Kontaktovat uživatele:

Re: MySQL a transakce

Příspěvek 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í...
PC : CPU: C2D E5200 2500Mhz @ 3750Mhz a AC Freezer 7PRO MB: Gigabyte GA-P31-DS3L rev.2,1 GPU: ATI Radeon 3650HD 256MB RAM: A-Data Vitesta 2x2GB Zdroj: Forton OEM 400W HDD: Samsung F2 500GB
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
W3N4
Začátečník
Začátečník
Registrován: 06. srp 2008

Re: MySQL a transakce

Příspěvek od W3N4 »

Transakce se zamykanim samozrejme souvisi. Jinym zpusobem se neda docilit izolovanosti transakce (ACID).
pepak.net
Začátečník
Začátečník
Registrován: 14. srp 2006

Re: MySQL a transakce

Příspěvek 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.)
W3N4
Začátečník
Začátečník
Registrován: 06. srp 2008

Re: MySQL a transakce

Příspěvek 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.
arxeiss
Začátečník
Začátečník
Uživatelský avatar
Registrován: 19. črc 2008
Bydliště: Krmelín (předměstí Ostravy)
Kontaktovat uživatele:

Re: MySQL a transakce

Příspěvek 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
PC : CPU: C2D E5200 2500Mhz @ 3750Mhz a AC Freezer 7PRO MB: Gigabyte GA-P31-DS3L rev.2,1 GPU: ATI Radeon 3650HD 256MB RAM: A-Data Vitesta 2x2GB Zdroj: Forton OEM 400W HDD: Samsung F2 500GB
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
arxeiss
Začátečník
Začátečník
Uživatelský avatar
Registrován: 19. črc 2008
Bydliště: Krmelín (předměstí Ostravy)
Kontaktovat uživatele:

Re: MySQL a transakce

Příspěvek 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
PC : CPU: C2D E5200 2500Mhz @ 3750Mhz a AC Freezer 7PRO MB: Gigabyte GA-P31-DS3L rev.2,1 GPU: ATI Radeon 3650HD 256MB RAM: A-Data Vitesta 2x2GB Zdroj: Forton OEM 400W HDD: Samsung F2 500GB
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
Joži
Začátečník
Začátečník
Registrován: 13. čer 2004
Bydliště: Brno
Kontaktovat uživatele:

Re: MySQL a transakce

Příspěvek od Joži »

staviaš systém, kde takáto situácia nastane raz za 100 rokov, resp. riešiš problémy, ktoré ani nemáš
Odpovědět

Zpět na „Programování a web“