2008-11-25 14 views
5

In einem Projekt, das ich arbeite, gibt es eine Tabelle mit einem "on update" Trigger, der überwacht, ob eine boolesche Spalte geändert wurde (zB: false -> true = Aktion ausführen). Aber diese Aktion kann nur einmal für eine Zeile ausgeführt werden.Postgresql Nebenläufigkeit

Da mehrere Clients auf die Datenbank zugreifen, kann ich davon ausgehen, dass mehrere Clients versuchen werden, die gleiche Zeilenspalte parallel zu aktualisieren.

Trifft der "update" -Trenner selbst die Nebenläufigkeit selbst, oder muss ich dies in einer Transaktion tun und die Tabelle manuell sperren?

+0

Haben Sie einen signifikanten Leistungsabfall beobachtet, wenn gleichzeitig mehrere Trigger aktiviert waren? – ady

Antwort

17

Trigger behandeln keine Nebenläufigkeit, und PostgreSQL sollte das Richtige tun, unabhängig davon, ob Sie explizite Transaktionen verwenden oder nicht.

PostgreSQL verwendet optimistisches Sperren was bedeutet, dass die erste Person, die die Zeile tatsächlich aktualisiert, eine Sperre für diese Zeile erhält. Wenn eine zweite Person versucht, die Zeile zu aktualisieren, wartet ihre Update-Anweisung darauf, ob die erste Person ihre Änderung festschreibt oder einen Rollback durchführt.

Wenn die erste Person festlegt, erhält die zweite Person einen Fehler, anstatt dass ihre Änderung durchläuft und eine Änderung auslöscht, die für sie interessant sein könnte.

Wenn die erste Person zurückrollt, blockt das Update der zweiten Person auf und geht normal durch, weil es jetzt nichts überschreibt.

Die zweite Person kann auch die Option NOWAIT verwenden, wodurch der Fehler sofort statt blockiert auftritt, wenn ihre Aktualisierung mit einer nicht aufgelösten Änderung in Konflikt steht.

+1

+1 für die Verwendung des Wortes "obliterate." – swasheck