1

Я знаю теорию о том, что чтение с блокировками диапазона & блокировки записи хранятся в течение транзакции в сериализованном уровне изоляции. Я могу понять, что кто-то делает заявление «При прочих равных условиях, Сериализуемая изоляция МОЖЕТ, НО НЕОБХОДИМО, приведет к снижению параллелизма, чем к любому другому уровню изоляции». Но, как утверждают все блоги/документация, более низкий параллелизм и более высокий тупик кажутся определенными. Я пытаюсь понять, почему это должно быть в практическом смысле в моем конкретном случае. Вот вопросы, которые яПочему уровень Serializable Isolation приводит к проблемам взаимоблокировки и параллелизма?

  1. Если сериализации уровня изоляции привести к снижению параллелизма, если различные соединения не имеет доступ к такому же набору записей? Я предполагаю «точно настроенную» OLTP-систему, где каждый запрос является «точечным запросом», возвращающим только несколько строк, а оптимизатор подходит к большим планам. Я также думаю о страницах данных, а не об индексах.

  2. Зачем нужны тупики? Это связано с обновлением индексированных страниц? Но это может произойти на любом уровне изоляции, отличном от изоляции моментальных снимков. Итак, зачем выделять уровень Serializable Isolation?

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

ответ

1

Короткий ответ: вы в конечном итоге получаете больше и разных видов замков, начиная с read uncommitted вплоть до serializable. И на определенном уровне это имеет смысл; как еще механизм базы данных сможет сделать следующую гарантию?

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

Далее в документации говорится, что блокировки диапазона выведены. Так что, если вы делаете что-то вроде select * from dbo.yourTable where ID between 1 and 50, и в настоящее время только 10 строк в таблице (скажем IdS 1-10), приложение не сможет:

  • Вставьте любые данные для идентификаторов 11-50
  • Удаление/Обновление любого из 1-10

Если вам это нужно, вам это нужно. Но знай, к чему ты клонишь; блокировки общего диапазона, которые размещаются, несовместимы (чтение «приведет к блокировке») с большим количеством материала. См. the Lock Compatibility Matrix для получения полной информации.

+0

Я бы с вами согласился, если соединения действительно занимают блокировки. Но отвечаете ли вы все еще хорошо, если было бы редко для двух разных пользовательских подключений получать доступ к одной и той же записи/странице? – QFirstLast

+0

С блокировками диапазона вы блокируете метаструктуру. То есть, данные не требуются даже для операции, которая пытается модифицировать ее для блокировки (см. Пункты выше). Итак, если вы знаете, что ваши два (или более) приложения будут изменять непересекающиеся диапазоны, тогда вы добры. Но я бы ответил: зачем вам сериализуемую изоляцию в этот момент? –

+0

Спасибо, Бен. Что касается «зачем вам сериализуемую изоляцию в этот момент?», Мы еще не приняли решение.Мы находимся в процессе понимания характеристик, плюсов и минусов каждого уровня изоляции и применения его к нашей ситуации. Ваш ответ помог. Я попытаюсь отметить ответ в качестве ответа. В прошлый раз, когда я пробовал, сайт не позволял мне сказать: «Мне нужно было несколько х пунктов, прежде чем я смог это сделать». – QFirstLast

Смежные вопросы