Программирование >>  Построение запросов sql 

1 ... 90 91 92 [ 93 ] 94 95 96 ... 101


2. Если две транзакции, A и B, выполняются параллельно, то СУБД полагает, что результат будет такой же, как если бы:

- транзакция A выполнялась первой, за ней была бы выполнена транзакция B;

- транзакция B выполнялась бы первой, за ней была бы выполнена транзакция A.

Администратор транзакций гарантирует, что каждый пользователь (программа), обращающийся к базе данных, работает с ней так, как будто не существует других пользователей (программ), одновременно с ним обращающихся к тем же данным. Для практической реализации этого СУБД используют механизм блокировок [1, 11]. В случае, когда для выполнения некоторой транзакции необходимо, чтобы некоторый объект не изменялся непредсказуемо и без ведома этой транзакции, такой объект блокируется.

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

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

СУБД может блокировать:

- всю базу данных целиком;

- таблицу базы данных;

- часть таблицы;

- отдельную строку.

Это называется уровнями блокировки. Современные СУБД в основном используют блокировки на уровне частей таблиц (страниц) и/или на уровне записей.

При блокировке на уровне страниц СУБД захватывает для выполнения транзакции некоторый фрагмент таблицы, запрещая доступ к нему (на время выполнения транзакции) конкурирующим транзакциям. Последние, впрочем, могут захватить другие страницы той же таблицы. Так как размер страниц обычно невелик (1-8 Кб), то время ожидания транзакций, конкурирующих за доступ к страницам таблицы, оказывается приемлемым даже для режима оперативного доступа к базе данных.

Если СУБД имеет возможность блокировать для выполнения транзакции отдельные строки таблицы, то скорость обработки транзакции существенно повышается. Блокировка на уровне записей (строк) позволяет добиться максимальной производительности за счет того, что захватываемый объект (запись) является минимальной структурной единицей базы данных. Блокировка на уровне записей (row-level) реализована в Firebird.

Теоретически блокировка на уровне элементов данных (захват конкретного поля строки) позволит добиться еще большей производительности.

Для пояснения действия механизма блокировок на уровне записей, реализованного в СУБД Firebird, воспользуемся рис. 7.4.



СУБД

Транзакция А

12:00

UPDATE

PaySumma

SET WHERE

PayFactCD=1;

12:02

SELECT *

FROM

NachislSumma

12:05 ,

UPDATE

PaySumma

SET WHERE

PayFactCD=1;

12:07

COMMIT


Рис. 7.4. Использование блокировок на уровне записей

На рис. 7.4 представлены две таблицы учебной базы данных (PaySumma, NachislSumma), к которым возможен доступ в процессе выполнения двух транзакций - A и B. Сначала при выполнении транзакции A происходит обновление первой записи таблицы PaySumma. СУБД блокирует данную запись до тех пор, пока транзакция А не будет зафиксирована или отменена. Транзакция B выполняется параллельно и блокирует на момент своего выполнения первую запись таблицы NachislSumma. Затем в контексте транзакции А происходит выборка из таблицы NachislSumma. Такая выборка возможна (так как транзакцией В блокирована первая запись таблицы только для обновления, но не для чтения), однако транзакция А не увидит изменений,



сделанных неподтвержденным обновлением в транзакции В. Затем в процессе выполнения транзакции B делается попытка доступа к блокированной первой записи таблицы PaySumma. В результате обработка транзакции В приостанавливается и возобновляется только после того, как транзакция А завершается и освобождает блокированную ею запись таблицы PaySumma. Вместе с тем попытка обновления второй записи таблицы PaySumma в процессе выполнения транзакции B будет успешной, так как заблокирована не вся таблица PaySumma, а лишь первая запись.

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

Контрольные вопросы

1. Что может быть причиной разрушения или потери данных в БД?

2. Какие общие требования предъявляются к безопасности реляционных СУБД? На каких принципах базируется схема доступа к данным?

3. Какие привилегии доступа существуют в БД?

4. Как выполнить передачу привилегий с помощью SQL-запроса?

5. Из каких шагов состоит реализация механизма использования SQL-роли?

6. Каким образом осуществляется отмена привилегий на языке SQL?

7. Какие ограничения и правила необходимо учитывать при отмене привилегий оператором REVOKE?

8. Какие особенности связаны с передачей привилегий при использовании представлений?

9. Что такое транзакция? Какими ACID-свойствами характеризуются транзакции? В чем состоят преимущества использования транзакций?

10. Что такое фиксация транзакции? Как осуществляется фиксация транзакции на языке SQL?

11. Что такое откат транзакции? Как осуществляется откат транзакции на

языке SQL?

12. Как можно использовать пользовательские точки сохранения при работе с транзакциями?



1 ... 90 91 92 [ 93 ] 94 95 96 ... 101

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика