
- •8. Распределенные базы данных
- •8.1.Предпосылки возникновения рбд
- •8.2. Классификация систем по способам обработки данных
- •8.3. Однородные и неоднородные системы бд
- •8.4. Стратегия размещения данных в рбд по узлам сети
- •Функции сурбд
- •9. Удаленный доступ взаимодействия с базой данных
- •9.1. Режим работы с бд при удаленном доступе
- •9.2. Архитектура моделей удалённого доступа.
- •2.2.3. Двухуровневые модели. Модель файлового сервера (File Server, fs)
- •9.2.4. Модели удалённого доступа к данным (Remote Data Access, rda) в архитектуре «клиент-сервер»
- •9.2.5. Модель «сервера бд»
- •9.2.6. Хранимые процедуры (хп) и триггеры
- •9.3. Многоуровневые модели 9.3.1. Модель сервера приложений
- •9.3.2. Модель серверов баз данных.
- •9.4. Архитектура распределённых субд
- •10 .Параллельные процессы (или процесс транзакций)
- •10.1. Транзакции
- •10.2. Модели транзакций
- •3.3. Свойства транзакций
- •10.4. Восстановление системы.
- •10.5. Параллельные операции над бд
- •10.6. Проблемы параллелизма
- •10.7. Конфликт транзакций
- •10.8. Элементы блокировки.
- •10.8.1. Бесконечное ожидание и тупики
- •10.8.2. Способы предотвращения тупиков
- •10.9.1. Протоколы и расписания
- •10.9.2. Модель транзакции
- •10.9.3. Протокол, гарантирующий сериализуемость
- •10.10. Модели с блокировками для чтения и записи
- •10.11. Блокировки в Visual FoxPro
- •11. Безопасность бд
- •11.2. Система привилегий.
- •Факультативные возможности grant
- •11.3. Целостность данных
- •11.4. Шифрование данных
- •12. Хранилище данных
- •12.1. Концепция хранилища данных
- •12.2. Многомерная модель данных
- •12.3. Olap – системы
- •12.4. Интеллектуальный анализ данных
10.9.3. Протокол, гарантирующий сериализуемость
Этот протокол представляет собой просто требование, согласно которому в каждой транзакции все операции блокировки должны предшествовать всем операциям разблокирования. Подчиняющиеся этому протоколу транзакции называют двухуровневыми. Первая фаза называется фазой блокирования, а вторая – фаза разблокирования.
Например, на рис.10.10 транзакции T1 и T3 – двухфазные, а T2 – нет.
В литературных источниках доказывается, что любое расписание S двухфазных транзакций является сериализуемыми.
В некотором смысле двухфазный протокол – наилучший среди реально возможных. Можно показать, что для любой транзакции T1, не являющейся двухфазной, найдётся какая-либо транзакция T2, совместно с которой T1 сможет выполняться в несериализуемом расписании. Пусть транзакция T1 – не двухфазная. Тогда в T1 существует шаг UNLOCK A, предшествующий шагу LOCK B. Пусть T2, имеет вид T2: LOCK A; LOCK B; UNLOCK A; UNLOCK B; Легко видеть, что расписание на рис. 10.11 несериализуемо, поскольку обработка А требует, чтобы Т1 предшествовала Т2, в то время как обработка В требует обратного порядка.
Пример. Имеется расписание представленное на рис.3.13. 1 Т1:LOCK A 2 T1:UNLOCK A 3 T2:LOCK A 4 T2:LOCK B 5 T2:UNLOCK A
6 T2:UNLOCK B 7 T1:LOCK B 8 T1:UNLOCK B
Рис.3.13. Расписание транзакций
Рис.10.13. Граф предшествований.
Так как в графе существует цикл, расписание несериализуемо
В общем, могут существовать некоторые совокупности транзакций не являющиеся двухфазными, но соответствующие последовательным расписанием. Но поскольку сложно разобраться в этой совокупности транзакций, то лучше требовать, чтобы все транзакций были двухфазными.
10.10. Модели с блокировками для чтения и записи
Проводя различия между доступами только чтения и для чтения и записи, можно разработать более детальную модель транзакций, которая будет допускать некоторые виды параллелизма. Различают два вида блокировок:
1. Блокировки для чтения. RLOCK A (READ-LOCK A), что препятствует записи нового значения А любой другой транзакций во время чтения А транзакций Т. Однако блокировку А для чтения может одновременно установить любое число транзакций. 2. Блокировки для записи. WLOCK A (WRITE-LOCK). При блокировках для записи никакая другая транзакция не может установить для этого элемента блокировку для чтения, ни блокировку для записи. И блокировки для чтения, и блокировки для записи снимаются операторами UNLOCK (разблокировать). Два расписания эквивалентны, если 1. они продуцируют одно и то же значения для каждого элемента; 2. каждая блокировка для чтения, применяемая данной транзакцией, встречается в обоих расписаниях, когда блокируемый документ имеет одно и то же значение. В системе поддерживается два типа блокировок:
1. Х – блокировка (XLOCK – eXclusive lock) – блокировка без взаимного доступа. WLOCK обозначает то же самое.
2. S – блокировка (SLOCK – Shared lock) – блокировка с взаимным доступом. RLOCK обозначает то же самое.
X – блокировка записи S – блокировка чтения.
1. Если транзакция Т блокирует кортеж А (Х-блокировка), то запрос любой другой транзакции к А будет отменён.
2. Если транзакция Т, блокирующая элемент А (S – блокировка), то · запрос со стороны транзакции Т2 на Х-блокировку будет отвергнут · запрос со строки Т2 на S-блокировку будет принят Эти правила можно представить в виде матрицы совместимости (рис.10.14). Запрос транзакций Т1 и Т2 к одному элементу А. N-означает конфликтную ситуацию. Т2 – находится в состоянии ожидания. Y – полная совместимость, «–» - отсутствие блокировок.
Рис.10.14. Матрица совместимости транзакций
Проверка сериализуемости: Алгоритм 2. Проверка сериализуемости расписаний с блокировками для чтения/записи. Входные данные. Расписание S для совокупности транзакций T1,…,Tk. Выходные данные. Получение ответа, является ли S сериализуемым. Метод. Строим граф предшествованый G следующим образом. Узлы, как и прежде, соответствуют транзакциям. Дуги определяются следующими правилами: 1. Пусть в S транзакция Ti устанавливает блокировку элемента А для чтения, а Tj – следующая за ней транзакция (если она существует) – устанавливает блокировку А для записи. Тогда строим дугу из Ti в Tj. 2. Пусть транзакция Ti в S блокирует А для записи, а Tj – следующая за ней (если, конечно, такая существует) транзакция – устанавливает блокировку А для записи. Тогда строим дугу Ti -> Tj. 3. Пусть далее Tm – какая-либо транзакция, блокирующая А для чтения после того, как Ti снимает свою блокировку для записи, но перед тем, как Tj устанавливает блокировку А для записи (если Tj не существует, то Tm – любая транзакция, которая блокирует А для чтения после того, как Ti разблокирует его. Тогда строим дугу Ti -> Tm. Если граф G имеет циклы, то S не сериализуемо. Если же G ацикличен, то любая его топологическая сортировка определит последовательный порядок для транзакций. Процесс топологической сортировки определяется следующим образом. Из ацикличности G следует, что в нём существует узел Ti, который не имеет входящих дуг. Занесём Ti в список, удалив его из графа. Процесс повторяется до тех пор, пока в графе не останется узлов. Порядок перечисления узлов в списке даёт последовательный порядок транзакций.
Пример: Показано расписание 4-х транзакций. (1) – – – – – – – – – – – – – WLOCK A (2) – – – – – – – – – – – – – – – – – – – – – WLOCK B (3) – – – – – – – – – – – – – UNLOCK A (4) RLOCK A (5) UNLOCK B (6) WLOCK B (7) RLOCK A (8) UNLOCK B (9) WLOCK B (10) UNLOCK A (11) UNLOCK A (12) – – – – – – WLOCK A (13) UNLOCK B (14) – – – – – – – RLOCK B (15) – – – – – – – – – – – – – – – – – – – – UNLOCK A (16) – – – – – – – UNLOCK B Т1 Т2 Т3 Т4 Рис.10.15. Расписание транзакций
Первый оператор UNLOCK A выполняется на шаге 3, когда T3 снимает свою блокировку элемента А для записи. За шагом 3 следует блокировка А для чтения транзакциями Т1 и Т2 (шаги 4 и 7) и блокировка этого элемента для записи транзакцией Т4 на шаге (12). Таким образом Т1, Т2 и Т4 должны следовать за Т3 и мы строим дуги из Т3 в эти узлы.
Рис.10.16. Граф проверки сериализуемости
В связи с тем, что Т4 снимает блокировку В для записи на шаге 5, а следующую блокировку В для записи устанавливает Т3 строится дуга из Т4 и Т3. Образуется цикл, свидетельствующий о том, что расписание не является сериализуемым. Как и в модели, приводимой ранее, достаточной гарантией сериализуемости является двухфазный протокол, в соответствии с которым установление блокировок для чтения и записи предшествует всем операциям разблокирования.