Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wstrzymanie triggera na potrzeby transakcji
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
extreme-dh
Chciałem zobie trochę zoptymalizować funkcję rekurencyjną w PL/PGSQL. Wykonuje ona kilka(naście/dziesiąt/set) powiązanych ze sobą logicznie wierszach. Na tabeli w której są te wiersze wisi sobie trigger, który tworzy mi na podstawie danych z wiersza kolumnę pod tsearch2 (buduje z kilku pól jeden tsvector), ale mniejsza z tym.

Chciałem zawiesić wyzwalanie tego triggera na czas działania funkcji zeby niepotrzebnie nie mielił po bazie jak jeszcze się wszystko zmienia. Sprawę załatwiłem tak, że wewnątrz transakcji wykonuję:

ALTER TABLE jakas_tabela DISABLE TRIGGER jakis_trigger;
EXECUTE recurs(i, j);
ALTER TABLE jakas_tabela ENABLE TRIGGER jakis_trigger;

Wynik działania jest świetny wzrost wydajności dla testowej próbki danych 3-krotny
Tylko teraz mam problem, bo o ile dla jednego wątku wszystko działa jak należy to nie wiem jak taka funkcja zachowa się jeśli w czasie jej działania inny wątek będzie chciał zapisać jakieś dane do tej samej tabeli.
Czy wtedy jako ze triggery są przez ten moment wyłączone nie zadziałają w ogóle, czy też zadziałają bo blokada jest wykonywana w transakcji?

Nie wiem jak wybrnąć z tej sytuacji, bo nie znalazłem lepszego sposobu na zablokowanie wyzwalaczy wyłącznie dla aktualnej transakcji. Z tego co się orientuję to transakcja nic chyba nie da dla zapytania "ALTER TABLE" tak czy siak.

Jedyny pomysł jaki mi przychodzi do głowy to dorzucić tam LOCK TABLE, tylko nie wiem czy to dobry pomysł, a jeśli tak to jakiego typu (tylko blokada zapisu zeby poczekać na właczenie triggerów, odczyt zostaje dostępny) musiałby być ten LOCK.

Bardzo proszę o radę jesli ktoś tu zna się na rzeczy :]
goroteb
Zainteresował bym się tym jakiego typu ISOLATION LEVEL zastosować w tym przypadku. Znasz ten temat?
extreme-dh
O uszy mi się obiło, ale nie znam szczegółów
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.