Andrzej Prażmo

Andrzej Prażmo programista .NET,
właściciel firmy SEE
Software

Temat: PostgreSQL i sekwencje

Zauważyłem dziwny problem z sekwencjami w tej bazie, mianowicie, od czasu do czasu Postgres nie inkrementuje jednej z sekwencji. Zazwyczaj się to dzieje, gdy robię kilka insertów w jednej transakcji. Efekt jest taki, że po wstawieniu jednego rekordu, następna operacja się wywala z błędem o naruszeniu unikalności primary keya. Jeśli operacje przeprowadzam ręcznie, bez wywoływania funkcji "nextval" (w ogóle nie umieszczam pkeya w poleceniu "insert"), to wszystko jest ok, natomiast moja aplikacja korzysta z biblioteki Doctrine, która inserty robi po swojemu, no i wtedy pojawia się ten problem. Ktoś może zna przyczynę tego stanu rzeczy? Czyżby Postgres miał jakieś ograniczenia na liczbę wywołań "nextval" w jednej transakcji? Pliki konfiguracyjne ORM są jak najbardziej poprawnie skonfigurowane, zresztą, przy pojedynczym insercie jest ok.
Andrzej Prażmo

Andrzej Prażmo programista .NET,
właściciel firmy SEE
Software

Temat: PostgreSQL i sekwencje

Zauważyłem jeszcze jedną rzecz: we wszystkich tabelach pole z autoincrementem posiada typ "serial" a tylko ta jedna felerna tabela ma typ "integer NOT NULL DEFAULT nextval('nazwa_sekwencji')".

konto usunięte

Temat: PostgreSQL i sekwencje

Na nextval na określonym generatorze jest ładny nietransakcyjny lock. Stawiam na złą konfigurację ORMa.

Serial to pseudotyp, który wewnętrznie jest właśnie definiowany jako 'INTEGER DEFAULT nextval('generator')'. Ale możliwe, że dla tego ORMa to są dwie różne rzeczy i czegoś nie rozumie.

Nie ma ograniczeń na wywołania nextval. Najlepiej ustaw w konfigu postgresa min_log_duration_time=0, co powinno włączyć logowanie wszystkich zapytań, odpal te inserty, które się wywalają i zobaczysz dokładnie co Postgres dostaje.Ten post został edytowany przez Autora dnia 29.01.15 o godzinie 18:17
Andrzej Prażmo

Andrzej Prażmo programista .NET,
właściciel firmy SEE
Software

Temat: PostgreSQL i sekwencje

Szymon G.:
Na nextval na określonym generatorze jest ładny nietransakcyjny lock. Stawiam na złą konfigurację ORMa.

Serial to pseudotyp, który wewnętrznie jest właśnie definiowany jako 'INTEGER DEFAULT nextval('generator')'. Ale możliwe, że dla tego ORMa to są dwie różne rzeczy i czegoś nie rozumie.

Najprawdopodobniej to jest główna przyczyna. Korzystam z Symfony + Doctrine a tam ten Postgres jest tak troszkę po macoszemu potraktowany. Musiałem np. sporo googlać, żeby znaleźć rozwiązanie jak zbindować postgresowy typ timestamp with time zone z klasą DateTime, bo to, co generował automat nijak nie chciało banglać.
Nie ma ograniczeń na wywołania nextval. Najlepiej ustaw w konfigu postgresa min_log_duration_time=0, co powinno włączyć logowanie wszystkich zapytań, odpal te inserty, które się wywalają i zobaczysz dokładnie co Postgres dostaje.

Zrobiłem po prostu ALTER TABLE DROP COLUMN oraz ALTER TABLE ADD już z typem serial i działa poprawnie. Akurat w przypadku tej tabeli pkey był tylko dla zachowania integralności.
Tomasz Zadora

Tomasz Zadora programuję

Temat: PostgreSQL i sekwencje

Tak to jest z PHPowymi ORMami i kombajnami typu doctrine, nastawionymi na dominujący w tego typu rozwiązaniach MySQL.

Problem nie w tym, że Postgres nie inkrementuje, tylko w tym, że ORM w jakiś sposób korzysta z poprzednio wygenerowanej wartości.Ten post został edytowany przez Autora dnia 30.01.15 o godzinie 08:27
Andrzej Prażmo

Andrzej Prażmo programista .NET,
właściciel firmy SEE
Software

Temat: PostgreSQL i sekwencje

Tomasz Z.:
Tak to jest z PHPowymi ORMami i kombajnami typu doctrine, nastawionymi na dominujący w tego typu rozwiązaniach MySQL.

MySQL dla mnie ma jedną podstawową wadę: brak typu GUID. Autoincrement jest dobry, dopóki nie chcemy przenieść części danych z jednej bazy do drugiej. Miałem taki problem, gdy chciałem przenieść artykuły z jednej Joomli do drugiej. To był koszmar.
Tomasz Zadora

Tomasz Zadora programuję

Temat: PostgreSQL i sekwencje

MySQL ma swoje zalety/wady a PostgreSQL swoje. Co do przenoszenia bazy MySQL i problemów z autoincrement, to można to załatwić odp. komendami:

http://dev.mysql.com/doc/refman/5.7/en/example-auto-in...
Andrzej Prażmo

Andrzej Prażmo programista .NET,
właściciel firmy SEE
Software

Temat: PostgreSQL i sekwencje

Tomasz Z.:
MySQL ma swoje zalety/wady a PostgreSQL swoje. Co do przenoszenia bazy MySQL i problemów z autoincrement, to można to załatwić odp. komendami:

http://dev.mysql.com/doc/refman/5.7/en/example-auto-in...

Akurat w przypadku Joomli jest inny problem. Ten CMS posiada pewną specjalną tabelę, która przechowuje całą strukturę Joomli (kategorie, artykuły, komponenty, pluginy, szablony, itd.) w postaci drzewiastej. Przeniesienie np. artykułów z jednej Joomli do drugiej w praktyce wymaga zaktualizowania również tej tabeli. Gdyby były GUIDy, to sam proces przenoszenia byłby trywialny, do załatwienia paroma poleceniami SQL, przy autoincrementach zaczyna się koszmar, bo identyfikatory najczęściej nie są unikalne w kontekście dwóch baz.

Następna dyskusja:

[postgresql] Sekwencje po r...




Wyślij zaproszenie do