[ peca89bg @ 23.05.2011. 03:56 ] @
Pozdrav ljudi,

mozda je bilo pitanja na ovu temu ali ja stvarno nisam uspeo da nadjem

Npr,

imamo jednu tabelu users(id, user_name, pass, email) gde je id auto increment
druga tabela users_more(id, name, surname, nick name, ity, job)

kada ubacujemo novog usera, treba da imamo dva upita, e sad sta ako pukne recimo drugi upit a prvo je prosao?
onda po nekoj mojoj logici trebalo bi da se izbrise zadnji upisani red iz prve tabele...

ali opet, proveravati npr if(!rez2) izrbrisi zadnji red iz tabele 1(users) i nije neko elegantno resenje
ajde opet i nekako za 2 tabele ali sta ako imamo 10 upita i pukne recimo 1, 3, 8 i 9? :)

jel postoji nesto u php-u sto moze da resi ovo ili mozda sam mysql?

I da, posto sigurno postoji resenje :) da li postoje razlike ima izmedju inodb i myisam engine-a? :)

Pozdrav!
[ Miroslav Ćurčić @ 23.05.2011. 07:33 ] @
Na nivou MySQLa rešenje se zove Transakcija, i moraš koristiti innodb.
Na nivou PHPa rešenje znaš: if(!rez2)
[ bantu @ 23.05.2011. 07:38 ] @
Možda pomogne:
http://stackoverflow.com/quest...to-multiple-tables-in-database
[ vatri @ 23.05.2011. 07:44 ] @
Naravno da postoji razlika izmedju InnoDB i MyIsam, a eto jedna je to da za transakcije moras imati InnoDB.
Zatim "foreign key" je moguc samo u InnoDB.

Proguglaj malo za vise informacija.

U PHP-u ne znam za kvalitetno rjesenje osim da izvrsis DELETE nakon sto primjetis da se nesto nije izvrsilo kako treba :)
[ agvozden @ 23.05.2011. 08:22 ] @
mislim da begin/end radi i u myisam
[ VladaSu @ 23.05.2011. 10:36 ] @
Citat:
agvozden: mislim da begin/end radi i u myisam


Kako? :) Moze primer?
[ mlbrnda @ 23.05.2011. 11:02 ] @
Pozdrav svima,
mislim da je najlakše rešenje za ovaj slučaj korišćenje PDO ili MySQLi biblioteke koje podržavaju transakcije ukoliko se ne žele koristiti transakcije u MySQL-u.
[ VladaSu @ 23.05.2011. 11:07 ] @
Citat:
mlbrnda: Pozdrav svima,
mislim da je najlakše rešenje za ovaj slučaj korišćenje PDO ili MySQLi biblioteke koje podržavaju transakcije ukoliko se ne žele koristiti transakcije u MySQL-u.

Isto pitanje. Da li moze primer PDO ili MySQLi koji ne koristi transakcije u MySQL-u? :)
[ mlbrnda @ 23.05.2011. 11:31 ] @
Evo primera za PDO:
Code:

$pdo->beginTransaction();
try
{
$pdo->query("insert into korisnici values (null,'vladan')");
$rez = $pdo->query("select * from korisnici where ime = 'vladan'");
$rezFetch = $rez->fetch(PDO::FETCH_ASSOC);
echo $rezFetch["ime"];
$pdo->commit();
}
catch(PDOException $ex)
{
    $pdo->rollBack(); 
}


evo i za mysqli:

Code:

$mysqli->autocommit(false);
$mysqli->real_query("insert into korisnici values (null,'Petar')");
...
$mysqli->commit();

ili

$mysqli->rollback();
...


ovo za mysqli sam napisao malo skraćeno, isto bi trebalo koristiti u try-catch bloku, opširnije o mysqli transakcijama http://www.php.net/manual/en/mysqli.autocommit.php
i PDO transakcijama http://www.php.net/manual/en/pdo.transactions.php

I da, mislim da kapiram zasto iza vladinih poruka stoji smešak, ovo se ne može koristiti na myisam!!! :)

[Ovu poruku je menjao mlbrnda dana 23.05.2011. u 12:51 GMT+1]
[ VladaSu @ 23.05.2011. 14:31 ] @
@mlbrna
Smesak je zato sto i dalje koristis MySQL transakcije za koje se ne moze koristiti MyISAM. PHP ne moze da koristi transakcije vec samo MySQL.
Cim si napisao $pdo->beginTransaction(); ti koristis MySQL transakcije.

Code (php):

$mysqli->autocommit(false);  
//jednako sa
mysql_query("SET AUTOCOMMIT=0");

$pdo->beginTransaction();
//jednako sa
mysql_query("START TRANSACTION");
 


A pitao sam i za primer za BEGIN i END na MyISAM tabelama jer ni to ne obezbedjuje ono sto je coveku potrebno.

Resenje je samo MySQL transkacija ili neka druga baza koja podrzava vertikalno particionisanje ili preko PHP-a i to ovako nekako:
1. da proveri da li je uspeo insert u prvu tabelu
2. ako jeste onda radi insert u drugu tabelu
3. ako NIJE uspeo insert u drugu tabelu onda brise ono sto je uneo u prvu tabelu.

Ovde uvek postoji mogucnost da DELETE ne odradi posao ako dodje do neke greske.


[ midgard @ 24.05.2011. 13:18 ] @
Mozda bi stored procedure mogle da pomognu, ali nisam 100% siguran da ce da uradi rollback na sve prethodne upite.
[ VladaSu @ 24.05.2011. 15:56 ] @
U stored proceduri opet moras da izvrsis dva zasebna sql-a. Sto mu dodje kao da i nije u stored proceduti nego 2 odvojena sql-a.
Ako hoces u proceduri da koristis rollback onda opet moras da koristis transkacije sto mu opet dodje kao da koristis transakcije bez procedure.
U ovom slucaju procedura ne resava problem vec je samo suvisan korak. Zato sam pitao za primer za begin/end.
[ peca89bg @ 10.06.2011. 03:09 ] @


ovo radi odlicno! hvala :)

a sta recimo ako ima 2 upita za dve razlicite tabele ali te tabele nisu u vezi, to jest nemaju foreign key.
npr:
table order(id, description, price)
i table custom_order(id, price, image)

i sada deletujem where id=1 iz tabele order i where id = 100 iz tabele custom_order


da li ce transkakcija raditi ili radi samo sa parent and child tabelama?
[ VladaSu @ 14.06.2011. 18:50 ] @
Nemoj biti siguran u primer ako si ti table users i users_more vezane po user_id da ce dodeliti isti user_id.
Bolje da izvrsis prvo jedan sql da uzmes id pa da sa tim id-om insertujes u drugu tabelu.
Transakcije nemaju veze da li su tabele vezane. Jednostavno izvrsavas sql-ove koje ti hoces i ako mislis da nesto ne valja ponistis sve te sql-ove sa rollback i to je to.