Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Chování nextval, currval (PostgreSQL)

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Chování nextval, currval (PostgreSQL)

Autor: DAB

22:09:15 10.08.2011

Twisted Metal Player 2 Napsal:
-------------------------------------------------------
> Nevim jak na PSQL ale na ORACLE to rozhodne
> nezafunguje a hadal bych ze na PSQL taky ne.
> priradit do promene a pak pouzit.

I v Oracle se to chová rozumně - currval vrací hodnotu, kterou předtím vrátilo nextval v rámci dané session.
Aneb není důvod ke tvrzení, že to "rozhodně nezafunguje".

Citovat příspěvek

 

Re: Chování nextval, currval (PostgreSQL)

Autor: Jakub Vrbas

10:00:09 10.08.2011

Díky všem za odpovědi. Pro jistotu jsem si udělal test 2 souběžných transkací a skutečně vše funguje tak, jak jsem popsal v úvodním příspěvku - tedy použítí currval popsaným způsobem je bezpečné.

Citovat příspěvek

 

Re: Chování nextval, currval (PostgreSQL)

Autor: Maaartin

1:40:56 10.08.2011

No ono je to vlastne logicky. Jinak by to totiz melo jediny pouziti: Umoznit zavest chybu co se sakra spatne hleda.

Citovat příspěvek

 

Re: Chování nextval, currval (PostgreSQL)

Autor: Pavel Stehule

23:13:45 09.08.2011

Na curval se můžete dívat jako na lokální proměnnou (session) proměnnou, která se plní, vždy, když se v rámci session aktualizuje sequence. Tudíž její použití je absolutně bezpečné.

Pavel

Citovat příspěvek

 

Re: Chování nextval, currval (PostgreSQL)

Autor: Twisted Metal Player 2

16:02:20 09.08.2011

Nevim jak na PSQL ale na ORACLE to rozhodne nezafunguje a hadal bych ze na PSQL taky ne. priradit do promene a pak pouzit.

Citovat příspěvek

 

Re: Chování nextval, currval (PostgreSQL)

Autor: xyz3

15:54:39 09.08.2011

> Z tvé odpovědi jsem tedy pochopil, že to tak není a že se na to spoléhat nemohu.

V PostgreSQL je to prý ošetřeno, můžeš to nechat tak jak to máš.

Citovat příspěvek

 

Re: Chování nextval, currval (PostgreSQL)

Autor: xyz3

15:52:20 09.08.2011

Tak beru zpět, na PostgreSQL prý currval funguje v rámci jedné session správně, spletl jsem si to s jinou DB.

Citovat příspěvek

 

Re: Chování nextval, currval (PostgreSQL)

Autor: Jakub Vrbas

15:50:02 09.08.2011

Můj dotaz mířil právě k tomu souběhu 2 transakcí. Jestli náhodou 1. transakce nezamkne sequencer. Potom by bylo myslím použití currval možné. Z tvé odpovědi jsem tedy pochopil, že to tak není a že se na to spoléhat nemohu.

Citovat příspěvek

 

Re: Chování nextval, currval (PostgreSQL)

Autor: xyz3

15:40:05 09.08.2011

currval je zlo a nikdo při smyslech ho nepoužívá. Důvodem je race condition s jinou transakcí, rozuměj mezi nextval a currval může proběhnout další nextval v jiné transakci a máš o postaráno o týdny hledání chyby. Správné řešení je v takovém případě vygenerovat si ID předem do nějaké proměnné a pak to vložit na více míst z této proměnné

BEGIN;
select seq = nextval('sequencer');
INSERT INTO table1 VALUES (seq, 'data_X_TRANSAKCE_A');
INSERT INTO table2 VALUES (seq, 'data_1_TRANSAKCE_A');
select seq = nextval('sequencer');
INSERT INTO table1 VALUES (seq, 'data_Y_TRANSAKCE_A');
INSERT INTO table2 VALUES (seq, 'data_2_TRANSAKCE_A');
COMMIT;

tím se zajistí že do obou tabulek se dostane stejné ID.

Citovat příspěvek

 

Chování nextval, currval (PostgreSQL)

Autor: Jakub Vrbas

14:37:39 09.08.2011

Zdravím,
zajímalo by mě, zda se funkce nextval a currval chovají tak, jak se pokusím ilustrovat na následujícím příkladě:

BEGIN;
INSERT INTO table1 VALUES (nextval('sequencer'), 'data_X_TRANSAKCE_A');
INSERT INTO table2 VALUES (currval('sequencer'), 'data_1_TRANSAKCE_A');
INSERT INTO table1 VALUES (nextval('sequencer'), 'data_Y_TRANSAKCE_A');
INSERT INTO table2 VALUES (currval('sequencer'), 'data_2_TRANSAKCE_A');
COMMIT;

Očekávaný výsledek - v table1 i table2 budou stejné hodnoty 1. sloupce.

Zejména mě zajímá chování v případě dvou takovýchto transakcí. Mohu se spolehnout, že výsledek bude skutečně:
table1
------
1, 'data_X_TRANSAKCE_A'
2, 'data_Y_TRANSAKCE_A'
3, 'data_X_TRANSAKCE_B'
4, 'data_Y_TRANSAKCE_B'

table2
------
1, 'data_1_TRANSAKCE_A'
2, 'data_2_TRANSAKCE_A'
3, 'data_1_TRANSAKCE_B'
4, 'data_2_TRANSAKCE_B'

Nebo hrozí, že v případě souběžných transakcí dojde k jinému výsledku?

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: