Выбор уровня изоляции на основе управления версиями строк

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

  • Новая реализация изоляции фиксируемого считывания, использующая версии строк, если параметр базы данных READ_COMMITTED_SNAPSHOT установлен в ON.

  • Новый уровень изоляции — уровень изоляции моментального снимка — используется если параметр базы данных ALLOW_SNAPSHOT_ISOLATION установлен в ON.

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

  • Она требует меньшего объема пространства в базе данных tempdb, чем изоляция моментального снимка.

  • Она работает с распределенными транзакциями, в то время как изоляция моментального снимка этого не делает.

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

    ПримечаниеПримечание

    Разработчикам приложений, зависящих от поведения уровня изоляции read committed, возможно, стоит изменить их таким образом, чтобы они работали с обоими режимами изоляции. В противном случае важно отметить, что параметр базы данных READ_COMMITTED_SNAPSHOT остается установленным в OFF.

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

Условия использования уровня изоляции read committed на основе версий строк

Уровень изоляции read committed, использующая версии строк, обеспечивает согласованность считывания на уровне инструкций. Так как выполняется каждая инструкция в транзакции, формируется новый моментальный снимок данных, который остается согласованным для каждой инструкции до тех пор, пока не закончится выполнение инструкции. Используйте уровень изоляции read committed на основе версий строк в следующих случаях:

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

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

Условия использования изоляции моментального снимка

Изоляция моментального снимка обеспечивает согласованность считывания на уровне транзакции. Моментальный снимок данных формируется в начале транзакции моментального снимка и остается согласованным на протяжении всей транзакции. Изоляция моментального снимка используется в следующих случаях:

  • Необходим контроль оптимистичного параллелизма.

  • Низка вероятность того, что будет произведен откат транзакции из-за конфликта обновления.

  • Для приложения необходимо формирование отчетов, основанных на длительных многооператорных запросах, которые должны быть согласованы в определенные моменты времени. Изоляция моментального снимка дает преимущества, связанные с повторяющимися чтениями (см. раздел Эффекты параллелизма), без использования общих блокировок. Моментальный снимок базы данных может обеспечить сходный набор функций, но он должен быть реализован вручную. Изоляция моментального снимка автоматически предоставляет в базу данных последнюю информацию о каждой транзакции изоляции моментального снимка.

Преимущества уровней изоляции, основанных на управлении версиями строк

Уровни изоляции, использующие версии строк, обладают следующими преимуществами.

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

  • Инструкции SELECT не блокируют данные во время операции считывания (операции считывания не блокируют операции записи и наоборот).

  • Инструкции SELECT могут иметь доступ к последнему зафиксированному значению строки, в то время как другие транзакции обновляют строку без блокирования.

  • Уменьшается количество взаимоблокировок.

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

  • Меньшая степень укрупнения блокировок.

Стоимость уровней изоляции, основанных на версиях строк

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

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

  • Управление версиями строк увеличивает потребление ресурсов во время изменения данных, так как версии строк сохраняются в базе данных tempdb.

  • Если параметры базы данных READ_COMMITTED_SNAPSHOT или ALLOW_SNAPSHOT_ISOLATION установлены в ON, транзакции обновления и удаления для определенной базы данных должны поддерживать версии строк, даже если транзакций, использующих уровень изоляции на основе версий строк, нет. Чтобы создать согласованный моментальный снимок данных при помощи версий строк, необходимы системные ресурсы (процессор и память), а также возможны операции ввода-вывода. Так как версии записей хранятся в базе данных tempdb, производительность повышается и количество выполняемых операции ввода-вывода уменьшается, если большее количество страниц базы данных tempdb может храниться в памяти для ведения версий строк.

    ПримечаниеПримечание

    Вставка строки обычно не формирует версию строки. Однако при определенных обстоятельствах команда INSERT формирует версию строки. Например, если строка вставляется в таблицу с уникальным индексом, и если удаленная до этого версия строки (фантомная запись) не усечена, команда INSERT формирует версию строки.

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

  • К каждой строке базы данных добавляются дополнительные 14 байт, необходимые для данных версии строк.

  • Производительность обновления может понижаться из-за работы, связанной с поддержанием версий строк. Для типичных рабочих нагрузок OLTP каждое обновление изменяет только несколько строк в базе данных. В этих системах производительность операций обновления в базе данных с параметрами ON может быть лишь на несколько процентов меньше по сравнению с базами данных с обоими параметрами, установленными в OFF. Затраты на обеспечение производительности при обновлении с учетом версий увеличиваются с ростом количества данных, участвующих в изменении во время операций обновления.

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

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

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

Системы, выигрывающие от использования уровней изоляции на основе версий строк

Сценарии, выигрывающие от использования уровней изоляции на основе версий строк, включают в себя следующее:

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

  • Изменение приложения для использования компонента Microsoft SQL Server Database Engine вместо других реляционных систем управления базами данных, поддерживающих такие же уровни изоляции.

  • Системы, в которых для получения согласованных статистических данных с помощью таких функций, как AVG, COUNT или SUM, или выполняющих пересечение и соединение индексов, необходим уровень строгой изоляции (например с возможностью повторяющегося считывания или сериализации).

  • Системы, в которых имеется большое количество взаимоблокировок из-за конфликта чтения-записи.