Autor Zpráva
Tom4s
Profil *
Mohl by mi zde někdo pomoci s transakcemi v PHP a MySQL? Pokud je alespoň trochu dobře chápu, pokud vykonávám nějaký příkaz v transakci a současně spustím jiný příkaz z druhé stránky, který se týká stejné tabulky, jako příkaz první, měl by se nejdříve vykonat celý první příkaz a až po jeho dokončení by se měl vykonat příkaz druhý. Je to tak správně?

Nicméně se mi tak nedaří, níže uvedu dva kódy, které spouštím současně. První v transakci zapisuje 100 000 řádků (na každý řádek číslo) do tabulky POKUSNA. To je dotaz jež zabere cca 10 vteřin. Přibližně v polovině této doby spouštím druhý skript s transakcí, který by do stejné tabulky měl zapsat číslo "123456789". Kdyby to fungoval jak bych si představoval, číslo 123456789 by se zapsalo až na konec tabulky, tedy po vykonání prvního, dříve spuštěného, skriptu. Jenže toto číslo 123456789 se zapíše kamsi uprostřed tabulky.

Věděl by někdo kde je chyba, nebo jestli by se nenašlo nějaké jiné řešení? Nejlépe bez zamykání tabulky.

KÓD #1


$b = 100000;

mysql_query("start transaction");
mysql_query("set autocommit = 0");

for ($a=0; $a<$b; $a++)
{ mysql_query("insert into pokusna (cislo) values ('$a')"); }

mysql_query("commit");




KÓD #2


mysql_query("start transaction");
mysql_query("set autocommit = 0");

mysql_query("insert into pokusna (cislo) values ('123456789')");

mysql_query("commit");



Děkuji
bukaj
Profil
Tom4s
Vykonáváš příkazy nad tabulkou, které podporuje transakce, jako např. typu InnoDB?
Tom4s
Profil *
Ano, vše provádím na tabulce typu InnoDB.
Kajman_
Profil *
Přijde mi, že transakce není od toho, aby se dala data přesně po sobě, ale proto, aby se dala buď všechna nebo žádná. Nejsem si jistý, ale druhá transakce nemusí čekat na první.

To co chcete se spíš bude řešit tím zamykáním.
Kajman_
Profil *
Jo a bylo to by asi o něčem jiném, kdyby si obě transakce šahaly na stejný řádek.
Kajman_
Profil *
A není možné, že to server bere jako jedno spojení a commit z kódu 2 commitne i data z 1?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: