Согласованность чтения при разделении страницы - PullRequest
0 голосов
/ 13 июля 2020

Для простоты предположим, что у нас есть некоторая нелистовая страница A, где ключом является int. Мы хотим найти ключ 4812, и на данный момент у нас есть записи 2311 и 5974. Итак, текущий поток получает общую защелку для этой страницы и вычисляет, что ему нужна конечная страница B (для данных между 2311 и 5974).

В то же время какой-то другой поток вставляется на страницу B, предварительно получив на нем эксклюзивную защелку. Из-за вставки он должен разделить страницу на записи 3742 и создать новую страницу C с верхней половиной данных.

Первый поток завершил чтение и освобождает защелку на странице A. Если он пытается найти ключ 4812 на странице B (после освобождения эксклюзивной защелки) он не найдет его, потому что он был перемещен на страницу C во время разделения страницы.

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

У меня в основном 2 вопроса:

  1. Защелка только на уровне страницы или может быть и на уровне строки? Я не мог найти информации об этом. Если бы это было так, то влияние не было бы таким большим, но оно все равно было бы расточительным, если бы страницы не разбивались (а это чаще всего так).

  2. Есть ли какие-то другой механизм для этого?

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

...