В проекте, над которым я работаю, есть таблица с триггером «при обновлении», который отслеживает, изменился ли логический столбец (например: false -> true = выполнить какое-либо действие). Но это действие можно делать только один раз за ряд.
Будет несколько клиентов, обращающихся к базе данных, поэтому я могу предположить, что в конечном итоге несколько клиентов попытаются обновить один и тот же столбец строки параллельно.
Сам ли триггер «обновления» обрабатывает параллелизм, или мне нужно сделать это в транзакции и вручную заблокировать таблицу?


Триггеры не обрабатывают параллелизм, и PostgreSQL должен поступать правильно, независимо от того, используете вы явные транзакции или нет.
PostgreSQL использует оптимистическая блокировка, что означает, что первый, кто действительно обновит строку, получает блокировку этой строки. Если второй человек пытается обновить строку, его оператор обновления ждет, чтобы увидеть, подтвердит ли первый свое изменение или откатится.
Если первый человек совершает фиксацию, второй человек получает ошибку, а не его изменение, которое происходит и стирает изменение, которое могло быть им интересно.
Если первый человек откатывается, обновление второго человека разблокируется и выполняется нормально, потому что теперь оно ничего не перезаписывает.
Второй человек также может использовать опцию NOWAIT, которая заставляет ошибку возникать немедленно, а не блокировать, если их обновление конфликтует с неразрешенным изменением.
Наблюдали ли вы какое-либо существенное падение производительности при одновременном срабатывании нескольких триггеров?