Выбор ответа Senior Тестирование БД через SQL обновлено
Почему тест не видит запись
Вопрос
Автотест вставил строку в базу в открытой транзакции и сразу вызвал API, которое эту строку не нашло. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Незакоммиченная строка не видна другим соединениям. API работает в своём соединении, а PostgreSQL даже на READ UNCOMMITTED ведёт себя как READ COMMITTED и грязного чтения не допускает.
Варианты ответа
- API закешировало пустой ответ на предыдущем вызове и отдало его снова
- Без индекса по ключу новая строка попадает в выборку не сразу
- Незакоммиченная строка не видна другим соединениямправильный ответ
- PostgreSQL пишет вставки на диск пачками раз в несколько секунд, и до сброса их не видно
Разбор
API работает в своём соединении, а PostgreSQL даже на READ UNCOMMITTED ведёт себя как READ COMMITTED и грязного чтения не допускает. Тесту нужно зафиксировать данные (COMMIT) до вызова API, а потом убрать их. Задержки видимости после коммита нет, индекс на видимость не влияет. Кеш бывает, но тут строка просто не закоммичена.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.