Nikako da prokužim ovu funkciju.
Ako sam dobro skužio, ideja je da osiguramo da se desio kraj transakcije podataka…ako nije bilo kraja, poništit će se sve što se desilo od početka transakcije.
Ali ne kužim zašto ovako jedan jednostavan primjer ne radi, u čemu je fora?
mysqli_autocommit($db, FALSE);
for ($x=0; $x < 10; $x++)
{
$query="INSERT INTO table (value) VALUES ($x)";
mysqli_query($db,$query);
if($x===5)die();
}
mysqli_commit($db);
Znači sa uvjetom if($x===5)die(); jednostavno forsiram da se commit nikada ne desi…i očekujem naći praznu tablicu. No tamo uredno ostaju upisane vrijednosti 0-5.
Probao sam i bez die() …forsirajući grešku na nivou baze:
mysqli_autocommit($db, FALSE);
for ($x=0; $x < 10; $x++)
{
if($x===5) $x='force fail'; //failat će jer je value type=integer
$query="INSERT INTO table (value) VALUES ($x)";
mysqli_query($db,$query);
}
mysqli_commit($db);
…rekoh možda begin-comit radi samo kada greška dođe od tamo…no ista stvar, ostaju prvi upisi…
Ne kužim se u MySQL, ali recimo da se snalazim u MS SQL-u - no, princip je isti.
Kada se explicitno pokrene transakcija, transakcija ima dva moguća završetka. Jedan je commit, drugi je rollback.
U praksi to izgleda ovako:
počinje se transakcija
izvršavaju se SQL naredbe i prati se uspješnost (varijabla)
na kraju svih izvršavanja se napravi commit ili rollback, ovisno o statusu varijable
Ako sam dobro shvatio, ovo pokrećeš iz PHP-a ili čega već. Najbolje bi bilo sve poslove baze ostaviti bazi - znači napraviti storanu proceduru koja bi obavila posao.
Tako i ja očekujem da bi trebao biti tijek procesa. I probavao sam restorat bazu i sa rollback i na način da jednostavno ne trigiram commit. (Jer mi iz primjera nikako nije jasno…kako bi točno trebalo ići. Nikako da uhvatim jedan najosnovniji primjer koji mi radi)
…no nešto nisam skužio. Ako se promotre malo diagrami, iako se InnoDB pokazuje superiorniji skoro na svakom diagramu, može se primjetiti da njegova krivulja vrlo često ponire, dok MyISAM zadržava stabilnost na većem…
…e to nisam skužio, na čemu većem?
Tu pišu nekakve brojke diagrama 1,4,16,64,128,256 i gore u objašnjenju stoji:
Method of benchmark:
Prepare table with 1,000,000 records (about 350Mb of data on disk)
Run each query for 1, 4, 16, 64, 128, 256 concurrent threads.
For each thread perform a warm-up run (duration 180 sec), and then
Trebas uraditi ili commit ili rollback kako bi zatvorio transakciju tj. oslobodio resurse i unlock-ovao red u tabeli. U suprotnom ce cekati da se korisnik automatski “oktaci” sa baze i na taj nacin uradi isto ali to moze potrajati i inace je losa praksa jer bespotrebno jede resurse a i blokira pristup podacima drugim korisnicima.
Pod 2 bi trebale biti simultane konekcije ili broj korisnika koji vrte istu stvar.