Artur Formella

Artur Formella Student,
Politechnika Gdańska

Temat: Asynchroniczny Notify

Czy ktoś z Państwa wie jak można asynchronicznie uruchomić NOTIFY ?

Spraw wygląda tak - jest duże zapytanie złożone z wielu pod-zapytań, które mocno używają wyników poprzednich pod-zapytań. Systemowi, który zlecił wykonanie tego zadania zależy zarówno na wynikach cząstkowych jak i wyniku całości. Przy czym odpowiedź zawierająca te wyniki cząstkowe jest tym lepsza im szybciej nastąpi.

Nie ma możliwości wykonania każdej cząstek osobno ze względu na wydajność obliczania ich wielokrotnie.
Rozwiązaniem wydaje się być zwrócenie wielu odpowiedzi z jednego zapytania SQL, przy czym kolejne części powinny być zwracane w różnym momencie.

Polecenie PostgreSQL z użyciem CTE:

with sth1 as(
SELECT aa from long_query1()

), notify1 as (
SELECT pg_notify('notify_test', json_build_object('sth1', aa )) from sth1;

), sth2 as (
select long_query2( aa ) as bb from sth1

), notify2 as (
SELECT pg_notify('notify_test', json_build_object('sth2', bb )) from sth2;

)
select notify1,notify2;

Wydawało by się że jestem blisko rozwiązania, ale polecenie NOTIFY wykonuje się faktycznie dopiero po zakończeniu transakcji - czyli dopiero na końcu polecenia.

Czy ma ktoś lepszy pomysł?
Marcin Miga

Marcin Miga Programista. Po
prostu programista.

Temat: Asynchroniczny Notify

Wydaje mi się, że jest to bez sensu, co chcesz zrobić. Chcesz złamać zasadę atomowości baz danych, na których opierają się transakcje. Chcesz sobie gdzieś w locie odczytać wartość, która nie wiadomo, czy będzie prawidłowa (jeśli się transakcja nie powiedzie, to zmiennej nie powinno być w ogóle).
nie wiem, co robi pg_notify, ale spróbuj do środka wstawić RAISE NOTIFY "coś %', zmienna;

konto usunięte

Temat: Asynchroniczny Notify

Wydaje mi się, że nie chodzi o transakcję, a o zapytanie. Można zrobić procedurę w pl/pgSQL, albo w innym języku i wtedy... można wiele, np. z takiego Pythona można się połączyć z czym tam trzeba i dane oddać.

Też uważam, że fajnie byłoby opisać całość, bo sądząc po rozwiązaniu to raczej gdzieś po drodze został popełniony jakiś błąd. Ewentualnie to nie jest dobre miejsce do stosowania relacyjnych baz danych...

konto usunięte

Temat: Asynchroniczny Notify

NOTIFY interacts with SQL transactions in some important ways. Firstly, if a NOTIFY is executed inside a transaction, the notify events are not delivered until and unless the transaction is committed.

If the same channel name is signaled multiple times from the same transaction with identical payload strings, the database server can decide to deliver a single notification only.

https://www.postgresql.org/docs/9.6/static/sql-notify.htmlTen post został edytowany przez Autora dnia 19.01.17 o godzinie 11:52

Następna dyskusja:

Asynchroniczny WebService n...




Wyślij zaproszenie do