generator neprerusovane rady cisel
David Zabensky
zabensky na ica.cz
Pondělí Únor 11 16:14:53 CET 2002
Karel Zak wrote:
> On Mon, Feb 11, 2002 at 02:48:04PM +0100, David Zabensky wrote:
>
> (Chlape, delka radky v mailu ma cca 70 znaku...)
Diky za upozorneni, snad uz to bude lepsi. Omlouvam se vsem
ctenarum teto konference.
>
>
>>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.
Ano, omlouvam se za nepresne vyjadrovani. Nemyslel jsem
sekvenci jako objekt DB. Mel jsem na mysli moji pseudosekvenci.
>
>
>>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.
Ano, ale jina transakce muze delat nad starou hodnotou
select (coz v tomto pripade vadi).
>
> 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
>
>
>
Aha, to by mohlo byt reseni. Koukal jsem na napovedu a zda
se, ze je to presne to co hledam. Pokud jsem to pochopil
dobre, tak LOCK TABLE 'my_seq' IN ACCESS EXCLUSIVE MODE
zabezpeci to, ze zmeny bude moci delat jen ma transakce a
ostatni budou muset (i se ctenim) cekat na COMMIT/ROLLBACK.
Nepotrebuji to na generovani PK do tabulky. Melo by to
slouzit pro generovani nazvu kategorii, kde bude textovy
prefix + nejaka ciselna rada.
Moc dekuji, je to zrejme to, co jsem chtel.
David
Další informace o konferenci Test