Выбор ответа Senior Тестирование БД через SQL обновлено

Почему тест не видит запись

Вопрос

Автотест вставил строку в базу в открытой транзакции и сразу вызвал API, которое эту строку не нашло. Почему?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Незакоммиченная строка не видна другим соединениям. API работает в своём соединении, а PostgreSQL даже на READ UNCOMMITTED ведёт себя как READ COMMITTED и грязного чтения не допускает.

Варианты ответа

  1. API закешировало пустой ответ на предыдущем вызове и отдало его снова
  2. Без индекса по ключу новая строка попадает в выборку не сразу
  3. Незакоммиченная строка не видна другим соединениямправильный ответ
  4. PostgreSQL пишет вставки на диск пачками раз в несколько секунд, и до сброса их не видно

Разбор

API работает в своём соединении, а PostgreSQL даже на READ UNCOMMITTED ведёт себя как READ COMMITTED и грязного чтения не допускает. Тесту нужно зафиксировать данные (COMMIT) до вызова API, а потом убрать их. Задержки видимости после коммита нет, индекс на видимость не влияет. Кеш бывает, но тут строка просто не закоммичена.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме