Postgresql Concurrency - PullRequest
       13

Postgresql Concurrency

6 голосов
/ 26 ноября 2008

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

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

Обрабатывает ли сам триггер "обновление" сам параллелизм, или мне нужно сделать это в транзакции и вручную заблокировать таблицу?

1 Ответ

17 голосов
/ 26 ноября 2008

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...