Материал: Graber_Martin_-_SQL_dlya_prostykh_smertnykh_-_2014

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Глава 23. ГлобШ1ьные аспекты SQL

• Or изменения базы данных можно отказаться уже после проявления результата этих изменений, как в предыдущем примере: ошибочные действия были отме­ нены после того, как Diaпe получила свои выходные данные.

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

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

возможность вернуться назад и определить, что средние значения для Diane су­ ществовали в какой-то момент времени и что они должны были оставаться не­

изменными, если после этого момента времени не вносилось никаких

изменений. Этого не происходит, если обновление выполняется во время вы­ числения значения функции.

•Тупик. Два пользователя могут пытаться выполнить действия, которые оказы­

вают взаимное влияние. Например, два пользователя одновременно пытаются

изменить значения как внешнего, так и соответствующего ему родительского

ключей.

Возникало бы множество непредсказуемых ситуаций, если бы одновре,менно вы­ полняющиеся транзакции были бы неконтролируемыми. Но SQL обеспечивает управ­ ление параллелuзJuо.111 (со11си1тепсу controls). Смысл его в том, что каждая из одновременно выполняющихся команд выполняются так, как если бы она выполня­ лась совершенно одна от самого начала до момента получения результата (включая, по мере необходимости, команды COMMIT и ROLLBACK).

Точнейшая интерпретация этой ситуации - не разрешать воздействия на таблицу

более чем одной транзакции в один момент времени. Базу данных необходимо держать постоянно в состоянии доступности для множества пользователей, а это требует некото­ рого компромисса с управлением параллелизмом. Большинство SQL-систем предос­ тавляет пользователям варианты, позволяющие балансировать между параллелизмом в использовании данных и доступностью базы данных. Управление такими возможно­ стями осуществляется пользователем, DBA (администратором базы данных) либо и

тем, и другим. Иногда они выполняют управление независимо от самого SQL, даже

несмотря на использование операции SQL.

Механизмы SQL, которые разработчики применяют для управления совпадаю­ щими операциями, называются за.11ка.11и (блокировка.11и) (locks). Замки ограничива­ ют определенные операции на базе данных, когда другие операции или транзакции являются активными. Операции, на которые накладываются ограничения, вы­ страиваются в очередь и выполняются, когда блокировка снимается (некоторые разработки позволяют задать NOWAIT, при этом команда не ставится в очередь, а отвергается, давая возможность выполнить какие-либо действия вместо ожидания в очереди).

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

256

Как SQL работает одновременно с мно;жеством пользователей

конкретная реализация может позволять использовать ее в качестве параметра в коман­

де CREATE D8SPACE или в команде ALTER D8SPACE и, следовательно, определять ее индивидуально для различных dbspaces. Кроме того, системы обычно предоставляют

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

блокировки. 8 этом случае выполнение одной из команд откладывается, и соответст­ вующая ей блокировка отменяется.

Терминология и определение схем блокировки изменяются в широких пределах для различных программных продуктов, поэтому в дальнейшем будут использоваться проектные решения, принятые в системе управления базами данных 082 фирмы IВМ, поскольку в ней нашли воплощение наиболее общие прикладные аспекты. 18М явля­ ется лидером в этой области, и ее подходы широко воспроизводятся в других про­ граммных продуктах. Хотя различные программные продукты значительно отличаются от 082 по синтаксису и по деталям функционирования, основные воз­

можности практически схожи.

Типы блокировок

Существуют два основных вида блокировок: разделяемые блокировки (share locks) и исключительные блокировки (exclиsive locks). Разделяемые блокировки (или S-locks, S- блокировки) могут выполняться более чем одним пользователем в единицу времени. Это позволяет множеству пользователей осуществлять доступ к данным, не изменяя их.

ИсклЮчительные блокировки (или X-locks, Х-блокировки) запрещают любой доступ к

данным со стороны всех пользователей, кроме того, чья блокировка в настоящий мо­

мент выполняется. Исключительные блокировки используются для команд, изменяю­

щих содержимое или структуру таблицу. Такая блокировка держится до конца транзакции. Разделяемые блокировки используются для запросов. Продолжительность

их действия зависит от уровня изоляции.

Что такое уровень изаqяции (isolation level) для блокировки? Он определяет, какую часть таблицы охватывает блокировка. 8 082 различают три уровня изоляции: два - применимы и к разделяемой, и к исключительной блокировке, третий уровень приме­ ним к разделяемой блокировке. Они управляются командами, выходящими за рамки непосредственно SQL. Точный синтаксис команд, связанных с блокировкой, различен для различных программных продуктов. Следующее обсуждение является концепту­

ально полезным.

Уровень изоляции "повторное чтение" (read repeatabllity) гарантирует, что внутри данной транзакции все записи, участвующие в запросе, не изменяются. Поскольку об­ новляемые записи в транзакции являются объектом исключительной блокировки до прекращения транзакции, их нельзя никак изменить. С другой стороны, повторное чтение означает, что можно решить заранее, какие строки желательно блокировать и выполнить запрос, который их выбирает. До прекращения выполнения текущей тран­ закции не будет никаких изменений этих строк. Повторное чтение защищает пользо­ вателя, выполнившего блокировку, но его работа при этом замедляется.

Уровень стабильности курсора (cursor staЬility) защищает каждую запись от изме­ нения в процессе ее чтения или от ее чтения в процессе изменения записи. Такая ис-

257

Глава 23. Глобш~ьные аспекты SQL

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

Третий уровень изоляции в DB2 - это уровень "только для чтения" (read оп/у). Уровень изоляции "только для чтения" делает моментальный снимок данных; реально он совершенно не блокирует таблицу. Следовательно, этот уровень изоляции нельзя ис­ пользовать с командами обновления. Любое содержимое таблицы фиксируется, как еди­

ное целое, на момент выполнения команды и входит в состав выходных данных

запроса. Это необязательно для уровня стабильности курсора. Блокировка "только для чтения" позволяет убедиться, что выходные данные внутренне непротиворечивы."Толь­ ко для чтения" удобно для построения отчетов, которые должны быть внутренне после­ довательными и требовать доступа ко многим или ко всем строкам таблицы, а не к базе

данных, как к единому целому.

Другие способы блокировки данных

Внекоторых программных продуктах выполняется блокировка на уровне сТраницы,

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

ляции, рассмотренными ранее.

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

ции.

Сходное средство, доступное в некоторых системах, - блокировка dbspace. Про­ странства баз данных превосходят размеры страниц, а значит этот подход сочетает в себе преимущества в способе реализации и логические недостатки блокировки на уровне страницы. Предпочтительнее использовать блокировку нижнего уровня.

И11~оги

В этой главе были рассмотрены:

258

Итоги

•Синонимы (как создать новые имена для объектов данных)

•Пространство базы данных (dbspace) (как разделить доступное в базе данных пространство)

•Обработка транзакций (как сохранить или отказаться от изменений в базе дан­ ных)

•Управление параллелизмом (как SQL позволяет исключить влияние команд друг на друга)

Синонимы являются объектами, имеют имена и (иногда) владельцев, но не сущест­ вуют самостоятельно и независимо от таблицы, имя которой они заменяют. Они могут быть общими и, следовательно, доступными для каждого, имеющего доступ к объек­

ту, или принадлежать только определенному пользователю.

Dbspaces - это подразделы базы данных, выделяемые пользователям. Связанные таблицы, для которых часто выполняется операция соединения, лучше хранить в од­ ном и том же пространстве базы данных.

СОММIТ и ROLLBACK - команды, применяемые для сохранения в виде группы

всех изменений базы данных, начиная от предыдущей команды COMMIT или ROLLBACK или от начала сеанса, либо для отказа от них.

Управление параллелизмом определяет, в какой мере одновременные команды воз­

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

259

-----------~

--------------·

·

 

 

 

 

 

 

 

 

 

 

 

Работаем на SQL

1.Создайте пространство базы данных с именем Myspace, в котором 15 процентов пространства занимают индексы и 40 процентов используется для размещения

строк.

2.Вы передали привилегию выполнения команды SELECT для таблицы Orders пользователю Diane. Введите команду, которая позволит ссылаться на этутабли­ цу как на таблицу Orders без указания имени Diane в качестве префикса.

3.Если произойдет сбой питания, что случится со всеми изменениями, выполнен­

ными в текущей транзакции?

4.Если нельзя просмотреть содержимое строки из-за блокировки, что можно ска­ зать по поводу типа блокировки?

5.Если нужно знать общее число, максимальные значения и средние значения всех заказов, но вы не хотите, чтобы другие пользователи работали в это время с таб­

лицей, то какой тип защиты может оказаться подходящим в этом случае?

(Ответы даны в приложении А.)

260

Источник: https://studfile.net/preview/16418473/