Диго С.М. Базы данных проектирование и использование (1084447), страница 62
Текст из файла (страница 62)
Эта ситуация не приводит к искажению информации в базе данных и поэтому в некоторых ситуациях считается допустимой, Например в случае, если специалист проектирует форму отчета и в этом процессе получает черновые отчеты.
10.4.2. Блокировки
Проблемы, возникающие при одновременном обращении, нуждаются в своем разрешении. Наиболее популярные алгоритмы управления одновременным доступом основаны на механизме блокировок. Блокировка заключается в запрещении некоторых операций над данными (чаще - корректировки информации), если ее обрабатывает (корректирует) другой пользователь. В такой схеме всякий раз, когда транзакция пытается получить доступ к какой-либо единице данных, на эту единицу накладывается блокировка.
Обобщенная схема классификации блокировок приведена на рис. 10.6.
Блокировки накладываются в соответствии с правилами совместимости блокировок, исключающими конфликты чтение-запись, запись-чтение и запись-запись. Сериализуемость транзакций заведомо гарантируется, если блокировки, относящиеся к одновременно выполняемым транзакциям, удовлетворяют следующему правилу: «Ни одна блокировка от имени какой-либо транзакции не должна устанавливаться, пока не будет снята ранее установленная блокировка». Это правило известно под названием двухфазового блокирования, поскольку транзакция проходит при этом сначала фазу роста, когда она устанавливает блокировки, а затем фазу сжатия, когда блокировки снимаются. В общем случае снятие блокировок до завершения транзакции проблематично, поэтому в большинстве алгоритмов управления одновременным доступом применяется подход, когда блокировки не снимаются до конца транзакции.
Блокировка может выполняться автоматически, а может и управляться пользователем. Включение автоматической группировки обусловливается выполняемой над данными операцией. Желательно, чтобы как можно больше ответственности за блокировку было перенесено с разработчика или пользователя на систему управления базой данных.
В зависимости от блокируемых информационных единиц можно выделить следующие уровни блокирования: база данных, совокупность связанных таблиц, таблица, совокупность связанных записей, запись, поле. Выше были названы логические единицы реляционных баз данных.
Бывает, что уровни блокирования определяются в терминах физических единиц информации. Уровень блокирования может зависеть не только от СУБД, но и от операционной системы и даже от архитектуры компьютера. В этом случае необходимо знать специфику конкретной платформы, на которой реализована система. Объектами блокирования могут являться страница (page), группа страниц, область базы данных (dbspace) и др. Терминология и реализация в значительной степени зависят от конкретной системы.
Физическая единица может включать как часть таблицы, так и несколько разных таблиц. Все это скажется на частоте возникновения конфликтов и времени обработки, что необходимо учитывать при физическом проектировании БД и при управлении параллельным доступом.
В конкретных СУБД могут быть реализованы не все, а только некоторые из перечисленных уровней блокировок. Так, практически нигде не реализована блокировка на уровне поля. В Microsoft SQL Server только начиная с версии 6.5 был добавлен уровень блокировки записи, и то только для операций типа INSERT. В dBase, FoxPro предусматривается блокировка на уровне таблиц и записей.
Блокировка на нижних уровнях приводит к перегрузке менеджера блокировок и, как следствие, к падению производительности системы. С другой стороны, блокировка на более высоком уровне мешает конкурирующим пользователям получить доступ к нужным данным.
Некоторые системы предусматривают динамическую схему блокировки, заключающуюся в том, что сначала транзакция блокирует большую информационную единицу, например страницу. Если проявляется другая транзакция, претендующая на какую-то запись внутри этой страницы, то первая транзакция автоматически уменьшит зону блокировки до уровня записи.
Различают пессимистические и оптимистические блокировки. Пессимистические блокировки запрещают доступ к данным других транзакций, когда какая-то транзакция уже работает с ними. Последующие операции, которые могут привести к конфликту, либо ставятся в очередь, либо отменяются.
Оптимистические блокировки разрешают параллельное выполнение транзакций, отслеживают случаи возникновения конфликтов и обеспечивают их разрешение.
10.4.3. Режимы доступа к информации
При работе в многопользовательской среде файлы могут быть открыты в одном из режимов - разделяемом или исключительном. При исключительном (монопольном, эксклюзивном) режиме доступа с данной информационной единицей может работать только тот пользователь, который первый открыл файл. Эксклюзивное использование иногда называют блокировкой типа X (eXclusive lock), а разделяемое (блокировка с взаимным доступом) - S (Shared lock). Исключительные блокировки используются для операторов, изменяющих структуру таблицы или значения тех или иных полей.
Возможные сочетания видов блокировок приведены ниже.
X | S | - | |
X | N | N | Y |
S | N | Y | Y |
- | Y | Y | Y |
Эти же виды блокировок могут быть использованы и при блокировании других информационных единиц, например записи. Выбор вида (блокировки и информационной единицы, к которой она относится, зависит от того, какая операция выполняется, как много таких операций, каковы ограничения по времени выполнения обработки. Например, если осуществляется массовая корректировка какого-либо файла, то лучше открыть его в эксклюзивном режиме, чем последовательно блокировать каждую запись.
На рис. 10.7 изображен механизм использования блокировок при выполнении параллельных операций над данными. На этом рисунке представлена тупиковая ситуация, когда две транзакции одновременно ждут снятия блокировки. СУБД должны иметь механизмы разрешения тупиковых ситуаций.
10.4.4. Уровни изоляции в SQL
Подходы к разрешению проблем параллелизма в SQL претерпевали изменения по мере развития языка. Первоначально стандарт предписывал такую организацию одновременного выполнения операторов, чтобы это соответствовало ситуации, когда ни один из операторов не вводится до полного завершения предыдущего. В этой ситуации в любой момент времени только одна транзакция может иметь возможность изменять данные. Однако при большом числе одновременных корректирующих обращений такой подход может значительно снизить производительность системы. Поэтому (в тех
случаях, когда это возможно, ищется компромисс между обеспечением строгой целостности базы данных в любой момент времени и производительностью.
В SQL-92 определены так называемые уровни изоляции (isolation level).
-
Уровень SERIALIZABLE (последовательное выполнение) -обеспечивает максимальную степень целостности и соответствует требованиям предыдущих стандартов. Обычно именно этот уровень устанавливается по умолчанию. При его выборе каждая транзакция выполняется изолированно.
-
Уровень REPEATABLE READ (повторяющееся чтение) - допускает вставку новой записи в таблицу, обрабатываемую транзакцией. При этом в принципе может возникать эффект так называемой фантомной вставки.
-
Уровень READ COMMITTED (чтение с фиксацией) - допускает выполнение запроса при условии, что результаты параллельных транзакций были зафиксированы.
-
Уровень READ UNCOMMITTED (чтение без фиксации) - допускает выполнение запроса независимо от того, были зафиксированы результаты параллельных транзакций или нет.
Если транзакция объявлена как READ ONLY, то это переводит ее на уровень READ UNCOMMITTED.
Уровень изоляции определяется в предложении SET TRANSACTION, которое имеет следующий синтаксис:
SET TRANSACTION {ISOLATION LEVEL
{READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ
| SERIALIZABLE}
| {READ ONLY | READ WRITE}
| {DIAGNOSTICS SIZE число условий}}.,..;
Предложение DIAGNOSTICS SIZE определяет количество элементов, используемых для сохранения диагностической информации.
Уровень изоляции и характер транзакции (только чтение или чтение/запись) являются взаимозависимыми. Если задано READ WRITE, то ISOLATION LEVEL не может быть READ UNCOMMITTED. Если ISOLATION LEVEL определен как READ UNCOMMITTED, транзакция становится по умолчанию READ ONLY. В противном случае транзакция по умолчанию считается READ WRITE.
10.4.5. Использование хранимых процедур и триггеров для контроля целостности БД
Как отмечалось выше, при использовании технологии «клиент-сервер» запрос передается для выполнения на сервер. На практике часто встречается ситуация, когда один и тот же запрос выполняется многократно. Для сокращения времени выполнения таких запросов можно использовать хранимые процедуры. При этом запрос в оттранслированном виде хранится на сервере и при возникновении потребности в обработке данных на сервер передается не весь текст запроса целиком, а только обращение к соответствующей процедуре. Время выполнения запроса уменьшается не только за счет уменьшения сетевого трафика, но и в связи с тем, что процедура уже заранее и однократно транслирована, а оптимальный план ее выполнения можно определять сравнительно редко.
Другой способ выполнения некоторых стандартных для данной прикладной области операций - использование триггеров. Триггеры срабатывают каждый раз, когда выполняется заданная операция над заданной таблицей. В результате может быть выполнен один оператор SQL или вызвана хранимая процедура.
Хранимые процедуры и триггеры могут использоваться в разных ситуациях, в том числе и для контроля целостности БД.
10.5. Тиражирование данных
10.5.1. Основные понятия
Тиражирование - используемая в РБнД технология, предусматривающая поддержку копий всей БД или ее фрагментов в нескольких узлах сети. Копия базы данных, являющаяся членом набора других копий, которые могут быть синхронизированы между собой, называется репликой. Копии БД обычно приближены к местам использования информации. Как синоним понятию «тиражирование» используется термин «репликация». Тиражирование является сравнительно новой технологией.
Процесс обновления реплик, при котором происходит передача обновляемых записей и других объектов и согласование дублирующихся данных, называется синхронизацией. Обмен данными между репликами может быть как односторонним, так и двусторонним. Кроме того, возможна синхронизация реплик под управлением синхронизатора. В отличие от собственно распределенных систем (систем с фрагментированием), в которых, как правило, при выполнении распределенных запросов реализуется протокол двухфазной фиксации, в системах с реплицированными базами данных обычно используется инструментарий асинхронной репликации.
В настоящее время многие известные СУБД предлагают пользователям возможности репликации. Но, как и во всякой новой области, терминология и подходы к реализации отличаются от системы к системе.
В некоторых системах используются метафоры из издательской деятельности (издатель, публикация, подписчик).
Совокупность данных, которые могут подвергаться тиражированию, называется публикацией.
В системах с тиражированием присутствуют все функции, присущие другим видам распределенных систем, плюс еще специфические функции, вызванные именно тиражированием. Это функции, обеспечивающие пересылку изменений всем узлам-пользователям; функции поддержания идентичности всех копий (реплик) БД; если эталонная база - единственная, то функции формирования базы данных-эталона и некоторые другие. Причем часть этих функций может быть совмещена на одном узле, а часть - отсутствовать, в зависимости от использованной технологии тиражирования.
10.5.2. Преимущества и недостатки тиражирования
Преимущества. Использование технологии тиражирования имеет следующие преимущества:
-
сокращение сетевого трафика при выполнении запросов;
-
повышение доступности данных. Доступ к локальной копии БД обеспечивается даже в случае, если доступ к центральному серверу по той или иной причине невозможен;
-
повышение производительности (за счет приближения данных к месту их использования, а также за счет специфики технологии выполнения запроса: не нужно ждать, чтобы все части распределенной БД были одновременно доступны);
-
повышение автономности рабочих мест пользователей;
-
повышение надежности системы (наличие множества копий повышает вероятность восстановления системы в критических ситуациях);
-
уменьшение трафика (при определенных условиях);
-
уменьшение конкуренции за ресурсы со стороны пользователей.
Недостатки. Дублирование данных при использовании технологии тиражирования влечет за собой следующие очевидные недостатки:
-
дополнительный расход памяти;
-
сложность обеспечения целостности данных; возможность возникновения конфликтов при корректировке;
-
наличие временного лага между фиксацией события в БД и доступностью этой информации для всех пользователей сети;
-
повышенные требования к рабочим станциям;
-
системы с поддержкой тиражирования данных требуют тщательного продумывания схемы тиражирования. Само по себе проектирование современной БД представляет собой непростую задачу, а включение в нее схемы тиражирования данных требует дополнительного времени на проектирование и организацию.
10.5.3. Виды тиражирования
Существуют разные виды тиражирования. Они различаются степенью транзакционной целостности и степенью автономности узлов (что, как правило, находится в обратной зависимости друг от друга). Требования к механизму тиражирования зависят от задач, которые решает вся вычислительная система в целом.