Запись записей заблокирована в RepeatableRead - PullRequest
0 голосов
/ 26 августа 2010

У меня есть запрос к SQL Server (с использованием LLBL ORM, если это важно для вопроса), который выполняет большую выборку для набора связанных таблиц.

Этот запрос выполняется в транзакции с уровнем изоляции повторяемого чтения и фильтруется двумя столбцами состояния в главной таблице запроса.

Будут ли записи, «заблокированные от записи», только теми, которые соответствуют фильтру в основной таблице, или все записи будут эффективно заблокированы от записи до завершения выборки? Я предполагаю, что позже потребуется, чтобы убедиться, что новые записи не добавляются в набор результатов во время транзакции.

1 Ответ

1 голос
/ 26 августа 2010

, чтобы гарантировать, что новые записи не будут добавлены в набор результатов во время транзакции

Для этого требуется Сериализуемый уровень изоляции. Repeatable Read only гарантирует, что прочитанные строки смогут снова считываться позже в транзакции, но не препятствует одновременной транзакции вставлять новые строки, и эти новые строки будут видны в исходной транзакции после они совершены вставкой. При Serializable Read блокировки будут расширяться до диапазонов, поэтому новые записи , удовлетворяющие фильтру , не появятся. В зависимости от схемы таблицы (доступны индексы) ограничение может распространяться на всю таблицу (таблицы).

Вы должны серьезно подумать о том, чтобы делать все также в Snapshot Isolation, это устраняет почти все известные аномалии, но дороже по ресурсам, см. Использование ресурсов управления версиями строк .

...