Смекни!
smekni.com

Базы данных 10 (стр. 4 из 6)

Фактически задание домена означает задание типа и размера, используемых данных, а также задание ограничений целостности этих данных.

Имя атрибута не обязательно должно совпадать с именем домена.

Пример домена представлен в разделе 1.3. Домен определяется оператором SQLCREATEDOMAIN.

Ограничения семантики

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

Ограничения семантики для таблиц задаются с помощью предложения

CHECK (conditional-expression), вставляемого в оператор CREATETABLE (где conditional-expression определяет логическое условие, которое не может быть нарушено при модификации данных).

Пример.

CREATE TABLE EMP

(EMPNO INT NOT NULL,

LNAME VARCHAR (15),

FNAME CHAR (10),

DEPTNO SMALLINT,

HIREDATE DATE,

JOB VARCHAR (15),

PRIMARY KEY (EMPNO),

CHECK (HIREDATE <2009));

Здесь проверочное условие состоит в том, что столбец HIREDATEв таблице ЕМР (сотрудник) должен содержать значения меньшие, чем 2009 (текущий год).

Общие ограничения целостности

Общие ограничения целостности по своей сути во многом аналогичны ограничениям семантики. Однако они предполагают наложение любых ограничений на данные. В основе таких ограничений лежит проверка логического выражения, которое возвращает значение TRUE (истина) либо значение FALSE (ложь). Если возвращается значение TRUE, то ограничение целостности выполняется и операция модификации данных разрешается. Когда же возвращается значение FALSE, то операция модификации отменяется.

Общие ограничения целостности задаются с помощью оператора CREATE ASSERTION.

Синтаксис оператора:

CREATEASSERTION имя CHECK (условное выражение);

Здесь в параметре имя задается имя правила, а в параметре условное выражение – соответствующее условие ограничения.

Пример .

CREATE ASSERTION ABC1 CHECK

(NOT EXISTS (SELECT * FROM P

WHERE NOT (P.WEIGHT>0)));

Здесь применительно к таблице Р выполняется проверка, что каждый товар имеет положительный вес.

Лекция 10

1.19. Проблема параллелизма

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

Рассмотрим пример нарушения целостности БД двумя параллельно действующими транзакциями, представленный в табл. .

Время Операции транзакции А Операциитранзакции В Результат
t1 Читает запись i 10
t2 Читает запись i 10
t3 К записи iприбавляет число 10 20
t4 К записи iприбавляет число 15 25

В момент t1 транзакция А читает запись i, которая содержит число 10.

В момент t2 другая транзакция читает это же число. В момент t3 транзакция А модифицирует прочитанное число, прибавляя к нему число 10. В результате в БД оказывается число 20. Но в следующий момент транзакция В модифицирует прочитанное число, прибавляя к нему число 15. Таким образам, в записи i оказывается число 25. Это результат параллельной работы этих транзакций. Очевидно, что результат неправильный, т.к. две транзакции в сумме прибавили число 25. Значит, окончательным результатом должно было быть число 35, а не 25.

Фактически результат модификации, выполненной транзакцией А, пропал.

1.20. Блокирование информационных объектов базы данных

Все современные СУБД ориентированы на поддержку одновременной работы многих пользователей, а следовательно, на параллельную обработку транзакций. Для кор­ректной обработки параллельных транзакций без возникновения конфликтных ситуаций необходимо использовать некоторыйметод управления параллелизмом. Основным методом управления параллелизмом является блокирование (альтернативными являются метод временных меток и оптимистичные технологии).

Его основная идея очень проста: в случае, когда для выполнения некоторой транзакции необходимо, чтобы некоторый объект базы данных (например, отдельный кортеж таблицы или вся таблица) не изменялся непредсказуемо и без ведома этой транзакции, такой объект блокируется. Таким образом, эффект блокирования состоит в том, чтобы "заблокировать доступ к этому объекту со стороны других транзакций", а значит, пре­дотвратить непредсказуемое изменение этого объекта. Следовательно, первая транзакция в состоянии выполнить всю необходимую обработку с учетом того, что обрабатываемый объект остается в стабильном состоянии настолько долго, насколько это нужно.

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

Для пояснения идеи блокирования рассмотрим пример, приведенный на рис.1.18.


Рис.1.18. Пример блокирования таблиц БД

В данном примере предполагается, что БД состоит из 3 таблиц (ТОВАР, ОТДЕЛЕНИЕ, ЗАКАЗ). Блокирование производится на уровне таблиц, т.е. сразу блокируется вся таблица (хотя на практике не обязательно блокируется вся таблица; в данном примере без потери общности это предположение делается для простоты рассмотрения). Кроме того предполагается, что параллельно исполняются две тразакции А и В. На рис. под названием каждой транзакции приводятся операторы SQL этой транзакции с условным обозначением времени выдачи этих операторов.

В момент времени 01 транзакция А обновляет таблицу ТОВАР. Таблица оказывается заблокированной.

В момент времени 03 выполняется вставка в таблицу ОТДЕЛЕНИЕ. В результате эта таблица также блокируется.

Затем делается вставка в таблицу ТОВАР. При этом таблица остается заблокированной.

В момент 09 транзакция А заканчивается выдачей оператора COMMIT и таблицы ТОВАР и ОТДЕЛЕНИЕ разблокируются.

Транзакция В в момент 02 обновляет таблицу ЗАКАЗ, вследствие чего эта таблица блокируется. В момент 04 делается попытка вставки в таблицу ОТДЕЛЕНИЕ, но ранее эта таблица заблокирована транзакцией А, поэтому транзакция В не получает к ней доступа и оказывается в состоянии ожидания . Транзакция В находится в состоянии ожидания до момента 09. когда транзакция А разблокирует таблицу ОТДЕЛЕНИЕ . Таблица разблокируется со стороны транзакции А но тут же блокируется со стороны транзакции В и транзакция В продлжает свою работу, т.е. исполняет оператор вставки. В момент 11 транзакция В завершается и разблокирует таблицы ОТДЕЛЕНИЕ и ЗАКАЗ.

Таким образом, захват таблицы одной из транзакций приводит к задержке другой (других) транзакции, если она обращается к той же таблице. Задержанная транзакция переходит в состояние ожидания. Причем она будет находиться в состоя­нии ожидания до тех пор, пока не будет снята блокировка, заданная другой транзакцией.

Полного параллелизма нет, однако, если транзакции работают с разными таблицами, то действительно работают в паралель. В нашем примере такая ситуация наблюдается до момента 04.

В начале данного раздела мы сделали допущение, что блокируюся все таблицы целиком. Блокируемые информационные объекты могут быть разными или, как иногда говорят, разным может быть уровень блокирования (степень дробления блокировок ):

1. блокирование всей БД.

2. блокирование отдельных таблиц БД.

3. блокирование набора кортежей ( страниц).

4. блокирование отдельных кортежей.

Теоретически могут блокироваться и отдельные поля в отдельных кортежах, однако на практике СУБД такую возможность не реализуют из-за больших накладных расходов на систему: она должна отслеживать обращения к огромному числу полей.

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

Чаще всего блокирование выполняется на уровне отдельных кортежей.

Различают 2 типа блокировок:

1) блокировки без взаимного доступа ( Х-блокировки или монопольные блокировки, или блокировки записи),

2) блокировки с возможностью взаимного доступа (S-блокировки или разделяемые блокировки, или блокировки чтения).

Рассмотрим правила блокирования:

1. Если транзакция А блокирует некоторый кортеж p без возможности совместного доступа (Х-блокировка), то запрос другой транзакции В с блокировкой этого кортежа будет отменен. Т.е. транзакция В не сможет установить блокировку.

2. Если транзакция А блокирует кортеж p с возможностью взаимного доступа (S-блокировка), то возможны 2 случая:

А) запрос со стороны транзакции В на Х-блокировку этого же кортежа будет отвергнут;

Б) запрос со стороны транзакции В на S-блокировку этого же кортежа будет принят ( т.е. транзакция В сможет установить S-блокировку на кортеж p).

В правилах указано, что в качестве "блокируемых объектов" используются кортежи, хотя еще раз подчеркнем, что могут быть и другие типы объектов.

Эти правила можно формально описать с помощью матрицы совместимости, представленной в табл. 1:

Матрица совмес­тимости для Х- и S-блокировки Таблица 1

X S -
X N N Y
S N Y Y
- Y Y Y

Матрицу совместимости можно интерпретировать следующим образом. Рассмотрим некоторый кортеж р и предположим, что транзакция А блокирует кортеж р различными типами блокировки (это обозначено соответствующими символами S и X, а отсутствие блокировки — прочерком). Предположим также, что некоторая транзакция В запраши­вает блокировку кортежа, что обозначено в первом слева столбце матрицы (для полноты картины, в таблице также приведен случай "отсутствия блокировки"). Вдругих ячейках матрицы символ N обозначает конфликтную ситуацию (запрос со стороны транзакции В не может быть удовлетворен, и сама эта транзакция переходит в состояние ожидания), aY — полную совместимость (запрос со стороны транзакции B удовлетворен).