|
Программирование >> Программирование баз данных
Режимы блокировки Заранее продумывая организацию работы приложения, необходимо не только учитывать, на каком уровне должна происходить блокировка ресурсов, но и предусматривать применение определенного режима, с помощью которого должно происходить приобретение блокировок в запросе. А поскольку количество разнообразных ресурсов, которые могут быть заблокированы, достаточно велико, то велико и разнообразие режимов блокировки. Некоторые режимы являются взаимно исключающими (это означает, что эти режимы не могут применяться в сочетании друг с другом). Но есть и такие режимы, которые применяются для модификации других режимов. Возможность совместного использования режимов зависит от того, являются ли они совместимыми (более подробное описание того, в чем состоит совместимость между блокировками, приведено ниже в этой главе). В предыдущих разделах рассматривались блокируемые ресурсы, а в следующих разделах приведено последовательное описание режимов блокировки. Разделяемые блокировки Разделяемые блокировки относятся к наиболее простому типу блокировок. В частности, разделяемые блокировки используются, если требуется обеспечить только чтение данных, т.е. применительно к этим данным не планируется внесение каких-либо изменений. Чаще всего применение разделяемых блокировок не связано с какими-либо затруднениями, посколысу они совместимы с другими разделяемыми блокировками. Но из этого не следует, что при использовании блокировок этого типа не приходится ни о чем беспокоиться. Дело в том, что разделяемые блокировки могут применяться в сочетании почти со всеми прочими видами блокировок, но есть такие блокировки, которые исключают возможность применения разделяемых блокировок. Разделяемые блокировки служат прежде всего для указания на то, что с рассматриваемым ресурсом кто-то уже работает. Иными словами, при обнаружении разделяемой блокировки, установленной в другой транзакции, часто приходится либо отказываться от выполнения намеченных действий, либо организовывать их иначе. Это означает, что после ввода в действие разделяемой блокировки ее наличие должно учитываться при использовании блокировок любых других типов. Сами разделяемые блокировки применяются главным образом для того, чтобы была исключена возможность выполнять чтение незафиксированных данных пользователями. Исключительные блокировки Назначение исключительных блокировок полностью следует из их названия. Исключительные блокировки не могут применяться в сочетании с любыми другими блокировками. Если существуют какие-либо другие блокировки, то приобретение исключительной блокировки становится невозможным. С другой стороны, до тех пор, пока все еще остается активной исключительная блокировка, не допускается создание новой блокировки любого типа на том же ресурсе. Благодаря этому исключается возможность для нескольких пользователей проводить одновременно операции обновления, удаления и тому подобные действия. Блокировки обновления Блокировки обновления представляют собой своего рода сочетание разделяемых и исключительных блокировок. Любую блокировку обновления можно рассматривать как метку-заполнитель особого типа. Назначение блокировок этого типа вполне очевидно- для того чтобы выполнить операцию обновления с помощью оператора UPDATE, необходимо вначале определить, какие строки подлежат обновлению с помощью конструкции WHERE (при условии, что таковые существуют). Из того, что вначале необходимо проверить наличие определенного количества строк, следует, что на первом этапе требуется только разделяемая блокировка, и такая ситуация сохраняется фактически до тех пор, пока не происходит переход к этапу физического обновления. А после наступления этого этапа требуется исключительная блокировка. Блокировки обновления указывают, что имеется разделяемая блокировка, которая должна стать исключительной блокировкой после завершения первоначального просмотра данных, который осуществляется для определения того, какие именно данные должны бьггь обновлены. Таким образом, применение блокировок обновления основано на том факте, что любая операция обновления состоит из двух описанных ниже этапов. На первом этапе происходит считывание данных, соответствующих критериям конструкции WHERE (данных, подлежащих обновлению). Этот этап является неотъемлемой частью запроса на обновление, который осуществляется с помощью блокировки обновления. На втором этапе, если действительно решено выполнить обновление, разделяемая блокировка заменяется исключительной блокировкой. В противном случае блокировка обновления преобразуется в разделяем)тю блокировку. Преимущество организации работы с использованием блокировок обновления состоит в том, что такие блокировки предотвращают возможность возникновения одного из типов взаимоблокировок. Взаимоблокировки представляют собой не разновидность блокировок, а ситуацию, в которой нормальное продолжение работы становится невозможным. В частности, взаимоблокировка возникает, если при использовании блокировок в одной из транзакций исключается вероятность успешного продолжения работы и освобождения ресурсов, поскольку эти ресурсы захвачены с помощью блокировок во второй транзакции, притом что во второй транзакции для освобождения захваченных ресурсов требуется доступ к ресурсам, которые удерживаются в первой транзакции. Если не используются блокировки обновления, то вероятность возникновения подобных взаимоблокировок становится весьма значительной. В частности, рассмотрим такую ситуацию. Предположим, что с использованием разделяемых блокировок выполняются два запроса на обновление. В запросе А выборка завершена и наступил этап физического обновления. На этом этапе необходимо перейти к применению исключительной блокировки, но это невозможно, поскольку в запросе В еще не завершена выборка данных. Затем, после завершения выборки в запросе В, обнаруживается, что необходимо осуществить физическое обновление. Для этого в запросе В требуется перейти к использованию исключительной блокировки, но это невозможно, поскольку в запросе А еще не получен доступ к ресурсам, необходимый для эскалации блокировки до уровня исключительной. В результате возникает тупиковая сит}ация. С другой стороны, если в одной транзакции применяется блокировка обновления, то исключается возможность устанавливать во всех прочих транзакциях блокировки обновления для тех же ресурсов. С того момента, как в следующей транзакции предпринимается попытка приобрести блокировку обновления на заблокированньгх ресурсах, эта транзакция переводится в состояние ожидания на время, называемое тайм-аутом блокировки, но сама блокировка не предоставляется. Если первая транзакция освобождает блокировку до истечения тайм-аута блокировки во второй транзакции, то право установить блокировку передается тому, кто запросил ресурс во вторую очередь, и процесс обработки данных продолжается. В противном случае во второй транзакции возникаем ситуация ошибки. Блокировки обновления совместимы только с разделяемыми и намеченными разделяемыми блокировками (которые рассматриваются ниже). Намеченные блокировки Намеченная блокировка еще больше напоминает метку-заполнитель, чем блокировка обновления, и позволяет справиться с проблемами, которые возникают при использовании блокировок, способных охватывать разные уровни иерархии объектов. В частности, предположим, что в одной транзакции установлена блокировка на строке, а для вьшолнения второй транзакции требуется установить блокировку на странице, экстенте или даже модифицировать всю таблицу. Безусловно, необходимо исключить такую ситуацию, чтобы во второй транзакции был захвачен ресурс, на котором установлена блокировка в первой транзакции. Если не используются намеченные блокировки, то объекты более высокого уровня могут оказаться полностью заблокированными в связи с тем, что уже установлена блокировка на более низком уровне. Применение намеченных блокировок способствует повышению производительности, поскольку в процессе эксплуатации СУБД SQL Server требуется проверять наличие намеченных блокировок только на уровне таблицы и не заниматься проверкой наличия блокировок на каждой строке или странице, относящейся к таблице, для определения того, можно ли в транзакции заблокировать всю таблицу, не опасаясь нарушить работу другой транзакции. Намеченные блокировки подразделяются на три типа, описанных ниже. Намеченная разделяемая блокировка. Разделяемая блокировка, которая установлена или должна быть установлена на каком-то объекте, находящемся на более низком уровне иерархии по сравнению с максимально допустимым. Например, такая блокировка применяется, если на странице необходимо установить разделяемую блокировку уровня страницы. Блокировки этого типа применяются только к таблицам и страницам. Намеченная исключительная блокировка. Блокировка этого типа аналогична намеченной разделяемой блокировке, но отличается тем, что в ней предусматривается установка исключительной блокировки на объекте более низкого уровня. Разделяемая блокировка с намеченной исключительной блокировкой. Разделяемая блокировка, которая установлена или должна быть установлена на объекте, находящемся в иерархии объектов на уровне ниже максимально допустимого, но с помощью этой блокировки намечено осуществление модификации данных, поэтому в какой-то момент она преобразуется в намеченную исключительную блокировку.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |