Блокировка вновь созданной незафиксированной строки в двух одновременных транзакциях базы данных READ COMMITTED
Если у меня есть два READ COMMITTED
Транзакции базы данных PostgreSQL, которые одновременно создают новую строку с одним и тем же первичным ключом и затем блокируют эту строку, возможно ли успешно получить обе блокировки одновременно?
Мой инстинкт да, так как эти новые строки существуют только в отдельных областях транзакций, но мне было любопытно, если новые строки и блокировки обрабатываются по-разному между транзакциями.
1 ответ
Нет.
Первичные ключи реализованы с UNIQUE
(только в настоящее время) индекс b-дерева. Вот что происходит при попытке записи в индекс согласно документации:
Если конфликтующая строка была вставлена еще не принятой транзакцией, потенциальный вставщик должен ждать, чтобы увидеть, фиксирует ли эта транзакция. Если он откатывается, то конфликта нет. Если он фиксируется без повторного удаления конфликтующей строки, происходит нарушение уникальности. (На практике мы просто ждем окончания другой транзакции и затем возвращаем проверку видимости в целом.)
Жирный акцент мой.
Вы можете просто попробовать это с двумя открытыми транзакциями (две разные сессии) параллельно.