Pouziti autoincrementu

Honza Pazdziora adelton na informatics.muni.cz
Středa Červen 18 12:55:05 CEST 2003


On Tue, Jun 17, 2003 at 08:38:55PM +0200, Petr Vileta wrote:
> >  Jak vlastne treba u DB2 nebo MySQL dostanu nejake ID jeste pred tim
> >  nez neco vlozim do tabulky?
> No tak konkretne u MySQL to delam takhle:
> LOCK TABLE moje_tabulka WRITE, jina_tabulka WRITE;
> SELECT MAX(nejake_ciselne_pole)+1 FROM moje_tabulka;
> ...
> INSERT INTO moje_tabulka SET nejake_hodnoty;
> INSERT INTO jina_tabulka SET nejake_hodnoty;
> UNLOCK TABLES;
> Tim mam zarucene, ze behem zjistovani ID mi nikdo jiny do tablek nic
> nezapise, ale muze cist. Takze pokud jiny thread chce nacist data pro
> zobrazeni, nic u nebrani a pokud chce neco zapsat, tak proste ceka, dokud ja
> neskoncim se zapisem a neUNLOCKnu.

Prosim, nepouzivejte podobne postupy. Na podobne veci Vam databazovy
system dava databazove a transakcne hlidanou vec, a tou je v pripade
MySQL autoincrementovaci sloupec. Jedine u neho mate zajistenou
rozumnou propustnost celeho systemu spolu s korektnim provedenim te
veci.

Mimochodem, dokumentace MySQL rika

	If a thread obtains a WRITE lock on a table, then only the
	thread holding the lock can read from or write to the table.
	Other threads are blocked. Zdroj:
	http://www.mysql.com/doc/en/LOCK_TABLES.html

coz je dokonce v rozporu s Vasim pocitem, ze "nikdo jiny do tablek
nic nezapise, ale muze cist". Navic ve spojitosti s nizsi prioritou
write zamku muzete shodit propustnost celeho system na uroven more.

Pouzijte nastroje na to, na co jsou urcene. Na generovani posloupnosti
je v MySQL auto_increment. Vice
v http://www.mysql.com/doc/en/example-AUTO_INCREMENT.html

-- 
------------------------------------------------------------------------
 Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
 .project: Perl, mod_perl, DBI, Oracle, auth. WWW servers, XML/XSL, ...
		Only self-confident people can be simple.


Další informace o konferenci Test