ugrás a tartalomhoz

Hogyan lehet megszerezni az adatokat commit nélkül?

aspirany · 2008. Júl. 19. (Szo), 19.10
Sziasztok

Van 3 db InndoDB táblám (tranzakcio kezelés miatt)

ugyfel,szerzodes,termek

most ugy néz kia dolog van egy nagy form amiről az adatok bekerulnek a 3 táblába.

1. sql beteszi az ugyfel adatait az ugyfeltáblába
2. sql kreálna egy szerződés számot + berakná az ügyfél ID-t
3. sql a formról bekerülnek a termék adatai + a szerzodés ID

Tehát függnek egymástól a lekérdzések.Amig nincs commit az elsőn addig a 2. sql nem kapja meg az ugyfel ID-t
és igy tovább.

Hogyan lehet megszerezni az adatokat commit nélkül?

Köszönöm a segítséget.
 
1

last_insert_id

zila · 2008. Júl. 21. (H), 08.11
1. beszúrod az ügyfelet, lekérdezed az id-ját last_insert_id-val
2. létrehozod a szerződés számot az ügyfél id-val (ha ez egy insert, akkor last_insert_id-val lekéred a szerződés számot is)
3. eltárolod a form adatait a szerződés id-val
4. commit/rollback

A last_insert_id lekérdezése a tranzakcióban helyesen fogja visszaadni az id-ket.
2

én is

aspirany · 2008. Júl. 21. (H), 09.49
Köszi.
Közben én is utána jártam.
Igen ahogy te is montad LAST_INSERT ID()-t elkérem.

Ez mennyire biztonságos módszer? voltak meglepő dolgok.

Lenne még kérdéesem
A SELECT LAST INSERT_ID() result nem tér vissza true-va

illetve a tranzakcio kezelésnál hogy jobb vizsgálni az értéket?

1. minden select után
2. az osszes select végén, ha minden select true akkor commit,ha nem rollback.

Köszönöm
3

Commit / Rollback

Max Logan · 2008. Júl. 21. (H), 09.54
Én azt csinálom, hogy létrehozok egy $error változót, aminek a kezdeti értéke nulla. Minden SQL művelet után hozzáadom az $error-hoz a MySQL hibakódot. Ha nincsen hiba, akkor 0 + 0 = 0. Az utolsó művelet végén ellenőrzöm, hogy az $error nulla-e. Ha igen, akkor COMMIT, ha nem ROLLBACK.
4

Biztonságos

zila · 2008. Júl. 21. (H), 10.53
Teljesen biztonságos, ha mysql_last_insert_id()-vel kéred le (legalábbis emlékeim szerint, már régóta nem dolgozok mysql-lel...)

A last_insert_id az utolsó insert által használt autoincrement mező értékét adja vissza, tehát minden insert után kérd le, ha fel akarod használni az értéket. rollback akkor kell, ha a tranzakciódban valamelyik insert hibára fut (feltételezem a client_id és contract_id az foreign key-ként van megadva, így ha rossz kulcsot akarsz beírni, akkor constraint violation-re kell futniuk)