Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pitanje u vezi zakljucavanja tabele

[es] :: MySQL :: Pitanje u vezi zakljucavanja tabele

[ Pregleda: 1880 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Bokacio

Član broj: 189612
Poruke: 112
*.dynamic.sbb.rs.



+27 Profil

icon Pitanje u vezi zakljucavanja tabele23.01.2010. u 14:43 - pre 173 meseci
Pozdrav,

Koristim Delphi i MySQL (Zeos komponente)

Imam dve tabele:

prva
id INT AUTOINC
text CHAR

druga
id INT
id_prve INT
...

Potrebno mi je da nakon sto unesem slog u prvu tabelu, odmah dobijem njegov ID i ubacim novi slog(ove) u drugu tabelu sa tim ID-jem.

Problem mi nastaje (tj. verovatno ce mi nastati) kada se sa drugog racunara doda novi slog i tada cu dobiti pogresan ID.

Posto sam jos uvek pocetnik u radu sa bazama, pogledao sam na internetu i naisao na LOCK TABLES komandu. Sa njom sam zakljucao prvu tabelu, ali ne znam kako da drugom korisniku koji "ceka" javim da proba ponovo sa unosom nakon sto je sa UNLOCK TABLES tabela otkljucana.

Malo sam se igrao u MySQLFront-u i tamo uredno dobijem gresku, ali kako to izbeci u programu, tj. da li postoji nesto tipa IS_TABLE_LOCKED itd.

Da li mozda gresim na samom startu, pa da li mozda postoji bolji nacin za resavanje ovog problema?

Hvala na bilo kakvom savetu,

Pozdrav
 
Odgovor na temu

vbbojan
Atanasijevic Bojan
Digit Consulting d.o.o.
Beograd

Član broj: 31580
Poruke: 273
93.93.194.*

Sajt: www.digitconsulting.rs


+20 Profil

icon Re: Pitanje u vezi zakljucavanja tabele23.01.2010. u 22:17 - pre 173 meseci
Hint.

Mysql ima info funkciju LAST_INSERT_ID()

http://dev.mysql.com/doc/refma...s.html#function_last-insert-id

To je ono što ti treba, a najvažnije za tvoj problem sa više klijenata koji istovremeno insertuju je ovo:
Citat:
The ID that was generated is maintained in the server on a per-connection basis. This means that the value returned by the function to a given client is the first AUTO_INCREMENT value generated for most recent statement affecting an AUTO_INCREMENT column by that client. This value cannot be affected by other clients, even if they generate AUTO_INCREMENT values of their own. This behavior ensures that each client can retrieve its own ID without concern for the activity of other clients, and without the need for locks or transactions.

Pozdrav,
Bojan
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Pitanje u vezi zakljucavanja tabele23.01.2010. u 22:44 - pre 173 meseci
kao sto ti bojan rece .. last_insert_id() ti resava problem ... vecina konektora ima funkciju koja ti to odma vrati posle izvrsenog upita, ali uvek mozes da uradis i obican query i pokupis regularno vrednost ..

sto se zakljucavanja tabela tice, kada je tabela koja ti treba zakljucana a ti si uradio upit, tvoj query "ceka" na tu tabelu da se otkljuca (sam po sebi, bez da ti ista radis) i onda se izvrsi kad moze. Da bi se izbegao deadlock postoji nekoliko timeout parametara koji sluze da ako ovo cekanje predugo treba upit "pukne" i ti dobijes gresku. Ti programski, svaki upit moras da proveris da li se izvrsio kako treba i da u slucaju da nije pokupis gresku i odlucis sta ces da uradis (izadjes iz aplikacije, puknes, formatiras hard na klijentu, izbacis poruku o gresci ili ponovis ubpit ako ne neka "privremena" greska u pitanju)
 
Odgovor na temu

Bokacio

Član broj: 189612
Poruke: 112
*.dynamic.sbb.rs.



+27 Profil

icon Re: Pitanje u vezi zakljucavanja tabele24.01.2010. u 06:41 - pre 173 meseci
Hvala svima!

Sad shvatam kako radi last_insert_id(). Isprobacu ga malo nebi li ga bolje razumeo.

Pozdrav
 
Odgovor na temu

[es] :: MySQL :: Pitanje u vezi zakljucavanja tabele

[ Pregleda: 1880 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.