generator neprerusovane rady cisel
Karel Zak
zakkr na zf.jcu.cz
Pondělí Únor 11 15:16:25 CET 2002
On Mon, Feb 11, 2002 at 02:48:04PM +0100, David Zabensky wrote:
(Chlape, delka radky v mailu ma cca 70 znaku...)
> no jde o to, ze pokud budu mit vice soubeznych procesu jenz pojedou pod
> transakcema a udelam si neco takoveho jako select next_id from tbl a
> pote update next_id = next_id + 1. (ci naopak), tak:
>
> a) pokud budu mit vice procesu zaroven, vsechny dostanou zrejme stejnou
> hodnotu next_id platnou pro zacatek transakce. tu budou nasledne zvysovat
> o 1 a dostanu (napr. 3x) stejne ID. Coz je spatne.
Pokud to odkud se cte next_id zamknete tak se tam dostane prave jen
jedne proces. Nemluve o tom, ze po update uz tu radku i bez zamku
nikdo nezmodifikuje az do konce transakce, ktera ten update provedla.
Takze by to mohlo jit i bez zamku, stacila by transakce jen by se
ta hodnota asi musela zjistovat az po tom update a update by nesmelo
obsahovat where a nebo pouzivat select for update (viz dale).
BEGIN;
UPDATE .. SET id=id+1;
SELECT id ...;
nejake pouziti id;
COMMIT;
> b) pokud tohle budu opakovat v nejakem PLSQL cyklu (v ramci 1 transakce)
> o neznamem poctu opakovani, (for ...) bude v tom teprve zmatek. mozna to
> chapu spatne, ale u tohoto reseni ma kazdy backend svoji vlastni privatni
> kopii dat nad tabulkou se sekvenci, ne? a veskere zmeny jsou ostatnim
Sequence jak jsme se minule shodli neni v transakcni.
> neviditelne dokud neprovedu commit. tj. ostatni nevidi jake mam aktualni
> pouzivane ID.
Pokud se jedna o normalni tabulku tak je ta zmena neviditelna, ale
zaroven plati, ze nikdo jiny (=jina transakce) neprovede update na
radku, ktera je jiz zmenena a neni commitnuta.
Take zalezi jak se ptate. Muzete pouzit SELECT FOR UPDATE (viz.
manual) ktery u radek, ktere nejaka jina transakce modifikovala ceka
na jejich commit.
BEGIN;
SELECT id FROM ... FOR UPDATE;
...pouziti id;
UPDATE .. SET id=id+1
COMMIT;
> c) jak zjistim, ze nejake vygenerovane ID (tj. jenz bylo precteno) bylo
> opravdu pouzito (tj. klient pozdeji nevolal rollback)?? navic ty cisla by
> nemely byt ID jako takove, mel by se z nich generovat obecny text podle
> ruznych sablon (to ale s problemem nesouvisi).
Pokud zjisteni, update next_id a pouziti toho cista budou v jedne
transakci tak rollback zlikviduje vsechno i ten next_id+1.
Karel
--
Karel Zak <zakkr na zf.jcu.cz>
http://home.zf.jcu.cz/~zakkr/
C, PostgreSQL, PHP, WWW, http://docs.linux.cz, http://mape.jcu.cz
Další informace o konferenci Databases