Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: [postgres] izolacja tranzakcji i sekwencja

Joł

mam pytanie bo nie jestem pewien na 100%,

przykladowo:

- rozpoczynam tranzakcje
- robie jakis tam insert
- pobieram ostatni id rekordu w tej tabeli (select * from curval('seq_id'))
- commit

czy tranzakcja zapewnia ze zwrocony id bedzie na 100% indeksem rekordu ktory wstawilem?

czy powiniuennem dodac locka na poczatku tranzakcji:
LOCK TABLE tabela IN SHARE ROW EXCLUSIVE MODE
?

konto usunięte

Temat: [postgres] izolacja tranzakcji i sekwencja

Proponuję od razu robić INSERT ... RETURNING ID i po kłopocie, i prościej jest i nie musisz znać nazwy sekwencji, i zadziała nawet jak ręcznie podasz ID w insercie.

zobacz ostatni przykład tutaj:
http://www.postgresql.org/docs/9.0/static/sql-insert.html

konto usunięte

Temat: [postgres] izolacja tranzakcji i sekwencja

tak transakcja to zagwarantuje
tak jak napisałeś działa cały nasz system w którym jest już 320 sekwencji :)

konto usunięte

Temat: [postgres] izolacja tranzakcji i sekwencja

Sebastian Krajewski:
tak transakcja to zagwarantuje
tak jak napisałeś działa cały nasz system w którym jest już 320 sekwencji :)

Bzdura.
Miedzy insertem a selectem wiele sie moze wydarzyc. Rozwiazanie Szymona jest poprawne, a robienie locka na tabeli w takim celu to strzal w kolano (chyba, ze z aplikacji bedzie jedna osoba korzystala).
Tomasz Poradowski

Tomasz Poradowski Specjalista od
wytwarzania
oprogramowania

Temat: [postgres] izolacja tranzakcji i sekwencja

Ireneusz Ptak:
Sebastian Krajewski:
tak transakcja to zagwarantuje
Bzdura.
Miedzy insertem a selectem wiele sie moze wydarzyc.

Owszem, może, ale danej transakcji to nie interesuje i ona będzie z currval() zawsze zwracać ostatnio wygenerowaną wartość nextval() dla danej sekwencji.
Piotr Krzyszkowski

Piotr Krzyszkowski Specjalista IT,
ALIOR BANK S.A.

Temat: [postgres] izolacja tranzakcji i sekwencja

- rozpoczynam tranzakcje
- robie jakis tam insert
- pobieram ostatni id rekordu w tej tabeli (select * from curval('seq_id'))
- commit

czy tranzakcja zapewnia ze zwrocony id bedzie na 100% indeksem rekordu ktory wstawilem?

?

Ja to robie trochę w zmienionej kolejności

1) id = select nextval('nazwa sekwencji');
2) insert ... id,....

Mam pewność, że moje id jest unikalne.

Rozwiązanie Szymona z RETURNING ID wydaje się jeszcze prostsze.
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: [postgres] izolacja tranzakcji i sekwencja

pytalem gosci na #postgresql i powiedzieli ze implementacja currval jest taka ze zwraca ostatnie id sekwencji dla danej sesji, wiec nie ma problemu z thread race, ale tak czy siak rownierz polecili insert ... returning id

konto usunięte

Temat: [postgres] izolacja tranzakcji i sekwencja

Łukasz C.:
pytalem gosci na #postgresql i powiedzieli ze implementacja currval jest taka ze zwraca ostatnie id sekwencji dla danej sesji, wiec nie ma problemu z thread race, ale tak czy siak rownierz polecili insert ... returning id

Racja, za szybko to przeczytalem:
"pobieram ostatni id rekordu w tej tabeli (select * from curval('seq_id'))"

Powyzsze to nie jest pobranie ostatniego rekordu z tabeli, tylko pobranie ostatniej sekwencji wygenerowaniej nextval'em :)
Błażej O.

Błażej O. Badania i rozwój
zaawansowanych
systemów
analitycznych

Temat: [postgres] izolacja tranzakcji i sekwencja

Trochę w tym wątku jest pomieszania z poplątaniem ...

a propos tego:

przykladowo:

- rozpoczynam tranzakcje
- robie jakis tam insert
- pobieram ostatni id rekordu w tej tabeli (select * from curval('seq_id'))
- commit

czy transakcja zapewnia ze zwrocony id bedzie na 100% indeksem rekordu ktory wstawilem?

Odpowiedź: NIE

Jeżeli chcesz mieć pewność użyj "Rozwiązanie Szymona z RETURNING ID" które jest od wersji PG bodajże 8.2 i do tego celu właśnie zostało stworzone.

Jeżeli masz starszą wersję użyj propozycji Piotrka:
1) id = select nextval('nazwa sekwencji');
2) insert ... id,....

currval lub lastval zwracają wartości ostatnio przydzielone dla sesji pg przez nextval i tylko tyle -> pomiędzy:
- robie jakis tam insert
- pobieram ostatni id rekordu w tej tabeli (select * from curval('seq_id'))
może się wiele zdarzyć np. jakiś triger manipulujący na sekwencji.

Dodatkowo należy zwrócić uwagę co należy rozumieć przez sesję w PG i jak się to ma do różnych operacji SQL -> np. przy PREPARE TRANSACTION po której wykonaniu dana transakcja już nie jest przypisana do bieżącej sesji.

To jest bardziej skomplikowana materia i przy prostych systemach bazodanowych rozwiązanie z currval lub lastval może działać poprawnie -> ale miej na uwadze że "może"...

A i jeszcze jedno -> również LOCK Ci tego nie zagwarantuje ...Błażej O. edytował(a) ten post dnia 01.07.11 o godzinie 22:55

konto usunięte

Temat: [postgres] izolacja tranzakcji i sekwencja

panie kolego !
uprzejmie proszę czytać powoli :)))))
returning id super sprawa zacznę z tego korzystać
pozdrawiam
Ireneusz Ptak:
Łukasz C.:
pytalem gosci na #postgresql i powiedzieli ze implementacja currval jest taka ze zwraca ostatnie id sekwencji dla danej sesji, wiec nie ma problemu z thread race, ale tak czy siak rownierz polecili insert ... returning id

Racja, za szybko to przeczytalem:
"pobieram ostatni id rekordu w tej tabeli (select * from curval('seq_id'))"

Powyzsze to nie jest pobranie ostatniego rekordu z tabeli, tylko pobranie ostatniej sekwencji wygenerowaniej nextval'em :)
Mieszko Kaczmarczyk

Mieszko Kaczmarczyk Kierownik
Infrastrukty
Systemowo-Techniczne
j, Administrat...

Temat: [postgres] izolacja tranzakcji i sekwencja

Piotr Krzyszkowski:
Ja to robie trochę w zmienionej kolejności

1) id = select nextval('nazwa sekwencji');
2) insert ... id,....

Mam pewność, że moje id jest unikalne.

Też tak dokładnie robię - najlepiej się sprawdza przy obciążonym serwerze jak zdarzają się piki zapytań na raz. Wg mnie największa jest interakcja serwera - najpłynniej to chodzi, zwłaszcza, że już sam INSERT można wtedy rzucić w tło i niech się wykona nawet z opóźnieniem.



Wyślij zaproszenie do