2008-11-25 11 views
5

W projekcie, nad którym pracuję, znajduje się tabela z wyzwalaczem "on update", który monitoruje, czy zmieniono kolumnę boolowską (np .: false -> true = wykonaj jakąś czynność). Ale tę czynność można wykonać tylko raz za rząd.Współgospodarz PostgreSQL

Będzie wielu klientów uzyskujących dostęp do bazy danych, więc mogę przypuszczać, że w końcu wielu klientów będzie próbować aktualizować równolegle tę samą kolumnę wiersza.

Czy "aktualizacja" sama wyzwala obsługę samej karty współbieżności, czy muszę to zrobić w transakcji i ręcznie zablokować tabelę?

+0

Czy zaobserwowałeś jakikolwiek znaczny spadek wydajności, gdy aktywowano wiele wyzwalaczy w tym samym czasie? – ady

Odpowiedz

17

Wyzwalacze nie obsługują współbieżności, a PostgreSQL powinien postępować właściwie, bez względu na to, czy używasz jawnych transakcji.

PostgreSQL używa optymistycznego blokowania co oznacza, że ​​pierwsza osoba, która rzeczywiście zaktualizuje wiersz, otrzyma blokadę w tym wierszu. Jeśli druga osoba spróbuje zaktualizować wiersz, ich instrukcja aktualizacji czeka, aby sprawdzić, czy pierwszy popełnia zmianę lub wycofuje.

Jeśli pierwsza osoba się zgodzi, druga osoba otrzyma błąd, a nie zmianę, która ulegnie zmianie i zatarcie zmiany, która mogła być dla nich interesująca.

Jeśli pierwsza osoba wycofa się, aktualizacja drugiej osoby odblokuje i przejdzie normalnie, ponieważ teraz nic nie zastąpi.

Druga osoba może również użyć opcji NOWAIT, która powoduje, że błąd występuje natychmiast zamiast blokowania, jeśli ich aktualizacja powoduje konflikt z nierozwiązaną zmianą.

+1

+1 za użycie słowa "zatarcie". – swasheck