2008-11-25 2 views
5

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

Доступ к базе данных будет состоять из нескольких клиентов, поэтому я могу предположить, что в конечном итоге несколько клиентов попытаются обновить один и тот же столбец строк параллельно.

Выполняет ли сам «обновление» сам дескриптор параллелизма, или мне нужно сделать это в транзакции и вручную заблокировать таблицу?

+0

Наблюдалось ли какое-либо значительное снижение производительности при одновременном включении многих триггеров? – ady 2015-05-11 11:41:47

ответ

17

Триггеры не обрабатывают параллелизм, и PostgreSQL должен делать правильные действия независимо от того, используете ли вы явные транзакции.

PostgreSQL использует оптимистичный замок, что означает, что первый человек, который фактически обновит строку, получает блокировку этой строки. Если второй человек пытается обновить строку, их оператор обновления ждет, чтобы убедиться, что первый совершает их изменение или откатывается.

Если первое лицо совершает ошибку, второй человек получает ошибку, вместо того, чтобы их изменение проходило и стирало изменения, которые могли быть им интересны.

Если первое лицо откатывается, обновление второго человека не блокируется и проходит нормально, потому что теперь он ничего не перезапишет.

Второй человек также может использовать опцию NOWAIT, которая делает ошибку немедленно, а не блокирует, если их обновление конфликтует с неразрешенным изменением.

+1

+1 для использования слова «стирать». – swasheck 2012-01-26 23:15:40