1

Temat: Wstrzymanie triggera na potrzeby transakcji

Na początek witam wszystkich forumowiczów, jestem tu pierwszy raz i widzę ze chyba przyda mi się to forum tongue

A teraz do rzeczy. 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 smile
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ę.

2

Odp: Wstrzymanie triggera na potrzeby transakcji

Nie wiem czy przetestowałeś to o czym piszesz ale według mnie gdy wyłączysz triggery w transakcji to wszystkie inne transakcje wstawiając cos do tej tabli zawisna do momentu az zrobisz commita lub rollbacka w transakcji z alterem. Mylę się?

Mozna by sarametryzować triggera, dodac dodatkową kolumnę do tabeli, która by sterowała pracą triggera. Wiem że to naiwne rozwiązanie ale tak na poczekaniu tylko to mi przyszlo do glowy smile.
Allbo utworzyć nowa tabele, któa będzie miala tylko jedna kolumne i jeden wiersz i to ona bedzie sterowala praca triggera. Na czas sesji mozesz tam ustawiac wartosc ktora bedzie zoanzczala ze trigger ma nie dzialac. Inne sesje nie beda tego widzialy i trigger w nich powinien dzialac.

Ostatnio edytowany przez rski (2010-01-22 00:44:37)