К списку
SQL и базы данныхSeniorТехническое

Как тестировать partial unique index и предотвращать конфликты при одновременной вставке

Краткий ответ

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

Развёрнуто

Краткий ответ

Для проверки partial unique index создаются параллельные транзакции с одинаковыми значениями бизнес-ключа в область действия индекса, ожидается ошибка нарушения уникальности. Далее проверяется корректное поведение приложения и отображение понятного сообщения об ошибке пользователю.


Как это работает

Partial unique index — уникальный индекс, применяемый только к подмножеству строк, удовлетворяющему условию (например, WHERE active = true). При одновременной вставке нескольких записей с одинаковым значением уникального поля в индексированном подмножестве возникает конфликт уникальности.

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

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

Шаг тестирования Описание
Подготовка данных Создать начальные записи, соответствующие условию partial index
Параллельные вставки Запустить несколько транзакций с одинаковыми ключами
Проверка результата Убедиться, что возникает ошибка нарушения уникальности
Валидация UX Проверить отображение понятного сообщения об ошибке пользователю

Пример

-- Создание partial unique index
CREATE UNIQUE INDEX idx_unique_active_email ON users(email) WHERE active = true;

-- Тест: две параллельные транзакции пытаются вставить одного и того же пользователя с active = true
BEGIN TRANSACTION;
INSERT INTO users(email, active) VALUES ('test@example.com', true);
-- В другой сессии
BEGIN TRANSACTION;
INSERT INTO users(email, active) VALUES ('test@example.com', true);
-- Ожидается ошибка unique violation

В тестах нужно отследить, что вторая вставка вызвала ошибку, а приложение корректно её обработало.

Что важно знать на собеседовании

  • Partial unique index ограничивает уникальность только для части строк, подходящих под условие
  • Гонки при вставке возникают при параллельных транзакциях с одинаковыми ключами
  • Необходимо тестировать конкурентные вставки и проверять корректное возникновение ошибок уникальности
  • Важно, чтобы UX приложения адекватно реагировал на такие ошибки, информируя пользователя
  • Знание механизмов изоляции транзакций и блокировок помогает понимать причины конфликтов

Тема: SQL и базы данных | Уровень: senior