Сериализуемая транзакция Postgres блокирует одновременную запись - PullRequest
0 голосов
/ 07 июня 2018

В документации по уровням изоляции PostgreSQL указано, что

Чтобы гарантировать истинную сериализуемость, PostgreSQL использует блокировку предикатов, что означает, что он сохраняет блокировки, которые позволяют ему определять, когдазапись имела бы влияние на результат предыдущего чтения из параллельной транзакции, если бы она выполнялась первой.В PostgreSQL эти блокировки do не вызывают блокировку и, следовательно, не могут играть какую-либо роль в возникновении тупика.Они используются для идентификации и пометки зависимостей между параллельными сериализуемыми транзакциями, которые в определенных комбинациях могут привести к аномалиям сериализации.

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

enter image description here

Как оператор about объясняет это поведение?Я ожидал, что вторая транзакция будет продолжаться до принятия, а затем получит ошибку could not serialize.

Кстати, схема таблицы event выглядит следующим образом:

CREATE TABLE event (
  id INT,
  created_at timestamp
)

1 Ответ

0 голосов
/ 07 июня 2018

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

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

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