|
Программирование >> Программирование баз данных
короткой, то количество объектов, которые могут в принципе вызвать взаимоблокировку, сводится к минимуму, а также сокращается продолжительность времени, в течение которого приходится сохранять блокировки на этих объектах. В этом состоят основные соображения, лежащие в основе данной рекомендации. Если же все операторы транзакции находятся в одном пакете, то сокращается количество циклов обмена данными сервером по сети в течение одной транзакции. В результате этого устраняются возможные задержки, из-за которых для завершения транзакции потребуется больше времени, а также освобождаются блокировки. Использование наиболее низкого необходимого уровня изоляции транзакции из всех возможных Эта рекомендация является далеко не такой простой, поэтому ее реализация требует определенной, достаточной серьезной проработки. В связи с этим не удивительно, насколько часто указанную рекомендацию просто не принимают во внимание. И в этом случае соблюдается известная в психологии аксиома: над тем, что действительно требует размышлений, чаше всего не размышляют вообще. Не будьте такими, как все, - уделите достаточное внимание этой проблеме. В распоряжении разработчика имеется несколько различных уровней изоляции транзакции. По умолчанию предусмотрен уровень READ COMMITTED. Если же применяется более низкий уровень изоляции, то разделяемые блокировки сохраняются в течение более короткого промежутка времени, чем при использовании более высокого уровня изоляции, поэтому конкуренция за блокировки уменьшается. Отказ от использования транзакций, время окончания которых не регламентируется По-видимому, эта рекомендация в наибольшей степени соответствует здравому смыслу из всех прочих приведенных рекомендаций, но именно она игнорируется чаще всего из-за приверженности давно устаревшим принципам организации работы. Разработчики с большим стажем (особенно те из них, которые работали в свое время с мэйнфреймами) чаще всего для предотвращения возникновения потерянных обновлений просто захватывали блокировку и удерживали ее до завершения работы с таблицей. Но невозможно даже описать, какие проблемы возникали в связи с применением такой организации работы. Рассмотрим следующий сценарий (который взят из реальной жизни). Сотрудникам коммерческого отдела предоставлена возможность использовать формы двух типов: предназначенные для обновления (с исключительными блокировками) и для просмотра данных (с разделяемыми блокировками). Один из сотрудников указанного отдела обязан контролировать ход работ, но для этого он обычно использует формы, предназначенные для обновления. Он открывает такую форму и, не закрыв ее, отправляется на обед, продолжающийся достаточно долго (1-2 часа). Но в форме обновления остается открытой строка, которая теперь заблокирована на все время отсутствия этого сотрудника. Но ситуация может развиваться по еще более худшему сценарию. В эпоху мэйнфреймов гораздо чаще, чем сейчас, применялась концепция организации очередей (фактически структуры данных на основе очередей могут оказаться весьма эффективными). Теперь предположим, что какой-то другой сотрудник запускает задание по выводу на печать (которое ставится в очередь) для вывода отчета, включающего ин- формацию о том заказе, который открыл у себя в форме сотрудник, прежде чем отправиться на обед. Задание должно оставаться в очереди до тех пор, пока не будет снята блокировка с соответствующей строки. А поскольку очередь печати обрабатывается последовательно, то все задания на печать, введенные в компании, накапливаются вслед за этим первым заданием (и работа всех сотрудников останавливается из-за того, что один человек отправился на обед, не освободив перед этим одну-единственную строку). Безусловно, этот пример показывает крайне неблагоприятное развитие ситуации, но вполне очевидно, что он позволяет наглядно подчеркнуть мысль, высказанную в этом разделе. Не следует ни в коем случае создавать блокировки, которые сохраняются на все время выполнения того или иного процесса, сроки завершения которого не регламентированы. Обычно под этим подразумевается взаимодействие с пользователем (как в приведенном выше примере с сотрудником, отправившимся на обед), но фактически аналогичную роль может играть любой процесс, для которого не определено время окончания. Использование связанных соединений Эта тема является весьма важной. К тому же при ее обсуждении с другими специалистами часто возникают разногласия, поскольку последствия применения связанных соединений напоминают ящик Пандоры. Стоит только приступить к использованию связанных соединений, как обнаруживаются все новые и новые сложности. Достаточно отметить, что такая форма взаимодействия с базой данных применяется чрезвычайно редко и требует привлечения специалистов очень высокой квалификации. Из сказанного не следует, что связанные соединения вообще не должны использоваться; необходимо лишь учитывать высокую вероятность возникновения нарушений в работе, а это требует весьма тщательного контроля над происходящим. По мнению автора, обычно можно найти более приемлемое решение. Теперь перейдем к вопросу о том, что представляют собой связанные соединения. Связанные соединения- это ряд соединений, которые рассматриваются как единое целое и получают возможность по существу совместно использовать одно и то же множество блокировок. Из этого следует, что если две транзакции участвуют в связанном соединении, то могут работать согласованно друг с другом так, что не возникает опасность возникновения взаимоблокировки по отношению друг к другу или создания одной транзакцией помех в работе другой транзакции. Оборотной стороной этого подхода является то, что фактически при его использовании разработчику самому приходится решать большинство задач обеспечения параллельной работы, поскольку блокировки больше не позволяют успешно организовать защиту ресурсов. Опыт автора показывает, что в подавляющем большинстве случаев можно обойтись без использования связанных соединений, поэтому в настоящей книге эта тема больше не рассматривается и основное внимание уделено описанию других способов повышения степени распараллеливания. Следует еще раз подчеркнуть, что применение связанных соединений требует решения чрезвычайно сложных задач взаимодействия отдельных соединений и тщательного управления действиями, выполняемыми в этих соединениях, поскольку в противном случае могут возникнуть проблемы нарушения целостности данных в системе. Резюме Транзакции и блокировки лежат в основе функционирования СУБД SQL Server, поэтому успешная разработка любых приложений для СУБД SQL Server неосуш;естви-ма без правильного использования этих средств обеспечения целостности данных. Транзакции позволяют обеспечить реализацию любых совокупностей операций в виде отдельных единиц работы, либо выполняемых целиком, либо не выполняемых вообще. А применение блокировок в СУБД SQL Server гарантирует, что в максимально возможной степени удастся избежать возникновения нарушений в работе, связанных с одновременным осуществлением в базе данных многочисленных операций (безусловно, полностью исключить возникновение таких нарушений в работе почти невозможно, но благодаря продуманной организации функционирования удается добиться очень многого). В результате правильного использования транзаюций и блоьсировок вопределен-ньЕх сочетаниях база данных приобретает так называемые свойства ACID (Atomicity, Consistency, Isolation, Durability- неразрывность, согласованность, изолированность, устойчивость). Краткие определения свойств ACID приведены ниже. Неразрывность. Транзакция выполняется по принципу все или ничего . Согласованность. Все ограничения и другие правила обеспечения целостности данных строго соблюдаются, и полностью обновляются все взаимосвязанные объекты (страницы данных, страницы индексов). Изолированность. Каждая транзакция полностью изолирована от всех прочих транзакций. На действия, осуществляемые в одной транзакции, невозможно оказать влияние, предусматривая выполнение каких-либо других действий в отдельной транзакции. Устойчивость. После завершения транзакции ее результаты передаются в систему на постоянное хранение. После этого данные находятся в безопасности, в том смысле, что из-за прекращения подачи электроэнергии или другого нарушения в работе системы, не связанного с отказом жесткого диска, не происходит полная или частичная потеря данных. Иными словами применение транзакций и блокировок позволяет свести к минимуму вероятность возникновения взаимоблокировок, обеспечить целостность данных и повышение общей эффективности системы. В следующей главе рассматриваются триггеры. В ней показано, что триггеры имеют широкую область применения, в частности, используются для реализации транзакций и осуществления операций отката.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |