SQL Server - противоречивое поведение при чтении незафиксированных изменений одной и той же транзакции

Работая с сервером SQL с уровнем изоляции "чтение зафиксированного снимка", мы регулярно записываем данные в базу данных и читаем их в дальнейшем в контексте той же транзакции. Обычно при чтении из базы данных мы видим наши собственные незафиксированные изменения, но только зафиксированные изменения, сделанные другими. Мы предположили, что это ожидаемое поведение.

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

Есть идеи, что может быть причиной несоответствия?

2 ответа

Решение

Оказывается, это известное несоответствие в SQL Server: когда вы читаете из базы данных, вы обычно видите незафиксированные изменения вашей собственной транзакции (на всех уровнях изоляции), но это не всегда гарантируется. Обходной путь в моем случае должен был использовать with (readuncommitted)доверяя механизму блокировки на уровне приложения, который предотвращает одновременное изменение одних и тех же данных.

Я получил тот же ответ от двух независимых экспертов по базам данных. К сожалению, я не нашел никакой письменной ссылки на проблему.

Есть несколько хороших статей о том, что может пойти не так. Возможно, они могли бы помочь

Крейг Фридман, Сериализуемый и Уровень Изоляции Снимка Черно-белая мраморная аналогия

Хьюго Корнелис, 4 статьи "Изоляция моментального снимка: угроза целостности": DRI / FK молча переходят на разные уровни изоляции

Другие вопросы по тегам