Построение базы данных

Автор работы: Пользователь скрыл имя, 12 Мая 2012 в 19:48, курсовая работа

Краткое описание

В данной курсовой работе затронуты проблемы, возникающие при параллельной работе, т.е. при выполнении логических единиц работы -транзакций.
Кроме этого рассмотрены современные методы и подходы для исправления и избегания данных проблем.
В практической части (Глава 3 Построение базы данных) описывается создание базы данных на примере футбольных матчей (БД «Футбольные матчи»). Данная база была построена с нуля, и в ней отображены все шаги при строительстве БД, начиная от создания таблиц и кончая сложными многотабличными формами и макросами. Имеется подробная иллюстрация различных шагов при создании этой базы данных.

Содержание

Введение
2
Глава 1. Транзакции
4
1.1. Понятие и сущность транзакций
4
1.2. Двухфазная фиксация транзакций
8
Глава 2. Проблемы параллельности и их решение
12
2.1. Проблемы параллельности
12
2.2. Решение проблем параллельности
23
Глава 3. Построение базы данных
46
3.1. Разработка и создание таблиц

3.2. Создание форм

3.3. Проектирование запросов

3.4. Создание кнопочной формы

3.5. Работа с макросами

Заключение
55
Список литературы

Вложенные файлы: 1 файл

Копия Содержание.doc

— 760.50 Кб (Скачать файл)

 

Обе транзакции успешно накладывают S-блокировки и читают объект . Транзакция A пытается наложить X-блокирокировку для обновления объекта . Блокировка отвергается, т.к. объект уже S-заблокирован транзакцией B. Транзакция A переходит в состояние ожидания до тех пор, пока транзакция B не освободит объект. Транзакция B, в свою очередь, пытается наложить X-блокирокировку для обновления объекта . Блокировка отвергается, т.к. объект уже S-заблокирован транзакцией A. Транзакция B переходит в состояние ожидания до тех пор, пока транзакция A не освободит объект.

Результат. Обе транзакции ожидают друг друга и не могут продолжаться. Возникла ситуация тупика.

Проблема незафиксированной зависимости (чтение "грязных" данных, неаккуратное считывание). Транзакция B изменяет данные в строке. После этого транзакция A читает измененные данные и работает с ними. Транзакция B откатывается и восстанавливает старые данные. Решение проблемы незафиксированной зависимости приведено в конце данной работы. (см. Приложение 1)

Результат. Транзакция A притормозилась до окончания (отката) транзакции B. После этого транзакция A продолжила работу в обычном режиме и работала с правильными данными. Конфликт разрешен за счет некоторого увеличения времени работы транзакции A (потрачено время на ожидание снятия блокировки транзакцией B).

Неповторяемое считывание. Транзакция A дважды читает одну и ту же строку. Между этими чтениями вклинивается транзакция B, которая изменяет некоторые значения в строке. Решение данной проблемы также возможно при использовании S и X – блокировок. Подобный пример возможного решения такого типа проблемы приведен в Таблице 6 .

 

 

 

 

Таблица 6. Пример решения проблемы неповторяемого считывания с помощью S и X-блокировок.

Транзакция A

Время

Транзакция B

S-блокировка - успешна

---

Чтение

---

---

X-блокировка - отвергается

---

Ожидание…

Повторное чтение

Ожидание…

Фиксация транзакции
(Блокировка снимается)

Ожидание…

---

X-блокировка - успешна

---

Запись

---

Фиксация транзакции

(Блокировка снимается)

Все правильно

 

 


Результат. Транзакция B притормозилась до окончания транзакции A. В результате транзакция A дважды читает одни и те же данные правильно. После окончания транзакции A, транзакция B продолжила работу в обычном режиме.

Фиктивные элементы (фантомы). Транзакция A дважды выполняет выборку строк с одним и тем же условием. Между выборками вклинивается транзакция B, которая добавляет новую строку, удовлетворяющую условию отбора.

 

 

Таблица 7.Попытка решения проблемы фиктивных элементов с помощью S и X-блокировок.

Транзакция A

Время

Транзакция B

S-блокировка строк, удовлетворяющих условию .
(Заблокировано n строк)

---

Выборка строк, удовлетворяющих условию .
(Отобрано n строк)

---

---

Вставка новой строки, удовлетворяющей условию .

---

Фиксация транзакции

S-блокировка строк, удовлетворяющих условию .
(Заблокировано n+1 строка)

---

Выборка строк, удовлетворяющих условию .
(Отобрано n+1 строк)

---

Фиксация транзакции

---

Появились строки, которых раньше не было

 

 


Результат. Блокировка на уровне строк не решила проблему появления фиктивных элементов.

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

Таблица 8. Попытка решения проблемы собственно несовместимого анализа с помощью S и X-блокировок.

Транзакция A

Время

Транзакция B

S-блокировка счета - успешна

---

Чтение счета и суммирование.
 

---

---

X-блокировка счета - успешна

---

Снятие денег со счета .
 

---

X-блокировка счета - отвергается

---

Ожидание…

S-блокировка счета - успешна

Ожидание…

Чтение счета и суммирование.  

Ожидание…

S-блокировка счета - отвергается

Ожидание…

Ожидание…

Ожидание…

Ожидание…

 

Ожидание…


Результат. Обе транзакции ожидают друг друга и не могут продолжаться. Возникла ситуация тупика.

          Разрешение тупиковых ситуаций. Итак, при использовании протокола доступа к данным с использованием блокировок часть проблем разрешилось (не все), но возникла новая проблема - тупики:

      Проблема потери результатов обновления - возник тупик.

      Проблема незафиксированной зависимости (чтение "грязных" данных, неаккуратное считывание) - проблема разрешилась.

      Неповторяемое считывание - проблема разрешилась.

      Появление фиктивных элементов - проблема не разрешилась.

      Проблема несовместимого анализа - возник тупик.

Общий вид тупика (dead locks) следующий:

Таблица 9. Общий вид тупика

Транзакция A

Время

Транзакция B

Блокировка объекта - успешна

---

---

Блокировка объекта -успешна

Блокировка объекта - конфликтует с блокировкой, наложенной транзакцией B

---

Ожидание…

Блокировка объекта - конфликтует с блокировкой, наложенной транзакцией A

Ожидание…

Ожидание…

Ожидание…

 

Ожидание…


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

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

Можно представить два принципиальных подхода к обнаружению тупиковой ситуации и выбору транзакции-жертвы:

      СУБД не следит за возникновением тупиков. Транзакции сами принимают решение, быть ли им жертвой.

      За возникновением тупиковой ситуации следит сама СУБД, она же принимает решение, какой транзакцией пожертвовать.

          Первый подход характерен для так называемых настольных СУБД (FoxPro и т.п.). Этот метод является более простым и не требует дополнительных ресурсов системы. Для транзакций задается время ожидания (или число попыток), в течение которого транзакция пытается установить нужную блокировку. Если за указанное время (или после указанного числа попыток) блокировка не завершается успешно, то транзакция откатывается (или генерируется ошибочная ситуация). За простоту этого метода приходится платить тем, что транзакции-жертвы выбираются, вообще говоря, случайным образом. В результате из-за одной простой транзакции может откатиться очень дорогая транзакция, на выполнение которой уже потрачено много времени и ресурсов системы.

Второй способ характерен для промышленных СУБД (ORACLE, MS SQL Server и т.п.). В этом случае система сама следит за возникновением ситуации тупика, путем построения (или постоянного поддержания) графа ожидания транзакций. Граф ожидания транзакций - это ориентированный двудольный граф, в котором существует два типа вершин - вершины, соответствующие транзакциям, и вершины, соответствующие объектам захвата. Ситуация тупика возникает, если в графе ожидания транзакций имеется хотя бы один цикл. Одну из транзакций, попавших в цикл, необходимо откатить, причем, система сама может выбрать эту транзакцию в соответствии с некоторыми стоимостными соображениями (например, самую короткую, или с минимальным приоритетом и т.п.).

Преднамеренные блокировки. Как видно из анализа поведения транзакций, при использовании протокола доступа к данным не решается проблема фантомов. Это происходит оттого, что были рассмотрены только блокировки на уровне строк. Можно рассматривать блокировки и других объектов базы данных:

Информация о работе Построение базы данных