
- •Вопрос 21. Внутреннее представление базы данных: понятие, создание, эксплуатация.
- •Разработка и отладка приложений. Выполняется разработчиками программного обеспечения на основе функциональных требований.
- •Конвертирование и загрузка данных в бд. Этот этап выполняется в том случае, если данные в бд загружаются из ранее существовавшей системы.
- •Тестирование работы базы данных и аис в целом. Различают такие виды тестов, как:
- •Эксплуатация и сопровождение созданной аис. Здесь можно выделить ряд задач:
- •Вопрос 22. Два уровня защиты данных в Interbase. Управление парольной защитой и виды паролей.
- •Привилегии sql: Второй уровень безопасности
- •Вопрос 23. Понятие изолированности транзакций. Уровни изоляции.
- •Вопрос 24. Взаимная блокировка транзакций. Управление выполнением транзакций.
- •Обнаружение взаимных блокировок
- •Предотвращение взаимной блокировки
- •Вопрос 25. Понятие дефрагментации и виды дефрагментации.
- •Вопрос 26. Понятие клиента и пользователя. Пользователи sysdba и public.
- •Пользователь sysdba
- •Вопрос 27.
- •Утилита ibConsole: создание файла бд и подключение к удаленной базе данных.
- •Вопрос 28. Утилита ibConsole: просмотр структуры удаленной базы данных.
- •Вопрос 29. Утилита ibConsole: создание и выполнение запросов к базе данных.
- •Интерактивное выполнение sql-запросов
- •Программа sql Monitor
- •Вопрос 30.
- •Утилита ibConsole: просмотр и ввод информации в таблицы базы данных.
Вопрос 24. Взаимная блокировка транзакций. Управление выполнением транзакций.
Взаимная блокировка (англ. deadlock) — ситуация в многозадачной среде или СУБД, при которой несколько процессов находятся в состоянии бесконечного ожидания ресурсов, занятых самими этими процессами.
Взаимная блокировка двух процессов P1 и P2 нуждающихся в двух ресурсах.
Пример:
Шаг |
Процесс 1 |
Процесс 2 |
0 |
Хочет захватить A и B, начинает с A |
Хочет захватить A и B, начинает с B |
1 |
Захватывает ресурс A |
Захватывает ресурс B |
2 |
Ожидает освобождения ресурса B |
Ожидает освобождения ресурса A |
3 |
Взаимная блокировка |
Обнаружение взаимных блокировок
Поиск взаимных блокировок осуществляется путем построения и анализа графа ожидания. В графе ожидания узлами отмечаются процессы и объекты. Блокировки отмечаются рёбрами, направленными от узла, соответствующего захваченному объекту, к узлу, соответствующему захватившему его процессу. Ожидания отмечаются рёбрами, направленными от узла, соответствующего ожидающему процессу, к узлу, соответствующему ожидаемому объекту.
Цикл в графе ожидания соответствует взаимной блокировке. Существует специальный алгоритм поиска циклов в графе.
Существуют алгоритмы удаления взаимной блокировки. В то же время, выполнение алгоритмов поиска удаления взаимных блокировок может привести к livelock — взаимная блокировка образуется, сбрасывается, снова образуется, снова сбрасывается и так далее.
Кроме того, эти алгоритмы реализуются менеджером ресурсов — программой, отвечающей за блокировку и разблокировку. Если же часть занятых в блокировке ресурсов распределяется кем-то другим, обнаружение взаимной блокировки невозможно. К примеру, СУБД Oracle обнаруживает взаимную блокировку запросов к её базам данных, но если в приведенном примере объекты — это поле базы и, к примеру, файл на жестком диске, взаимная блокировка обнаружена не будет — СУБД этот файл не обрабатывает и для неё взаимной блокировки нет.
Практически об устранении взаимных блокировок надо заботиться ещё на этапе проектирования системы — это единственный более-менее надежный способ с ними бороться. В крайнем случае, когда основная концепция не допускает возможности избежать взаимных блокировок, следует хотя бы строить все запросы ресурсов так, чтобы такие блокировки безболезненно снимались.
Предотвращение взаимной блокировки
Классический способ борьбы с проблемой — разработка иерархии блокировок, установление правила, что некоторые блокировки никогда не могут захватываться в состоянии, в котором уже захвачены какие-то другие блокировки. Говоря точно, речь о разработке отношения сравнения между блокировками, и о запрете захвата «большей» блокировки в состоянии, когда уже захвачена «меньшая».
В некоторых случаях, особенно в поделенных на модули архитектурах, это является проблемой. Так, например, в межмодульном интерфейсе приходится вводить вызовы, которые не делают ничего, кроме захвата и освобождения неких блокировок в модуле. Такой подход используется в файловых системах Windows в интерфейсе их взаимодействия с подсистемами кэша и виртуальной памяти.
В файловой системе существуют блокировки, «защищающие» переменные «размер файла» и «длина реально записанных данных в файле». В некоторых случаях возможно исполнение ввода/вывода на диск с удержанием этих блокировок.
Исполнение же ввода/вывода, в том числе построение запросов ввода/вывода, требует взятия блокировок низкого уровня уже в подсистеме виртуальной памяти, и следующий за этим вызов в файловую систему.
Для реализации этого шаблона файловая система предоставляет подсистеме виртуальной памяти вызовы, специально предназначенные для захвата блокировок.
Есть способы избежания данной проблемы:
Не бери ложку, если не положил вилку
Бери ложку и вилку сразу (WaitForMultipleObjects)
Для того чтобы избежать взаимной блокировки можно использовать специальные алгоритмы:
Алгоритм Банкира (взаимное исключение) - алгоритм распределения ресурсов и обхода взаимоблокировок разработанный Э. Дейкстра.
Предотвращение рекурсивной блокировки (взаимное исключение) - это предотвращает поток от входа в одну и ту же блокировку несколько раз.
Все операции, выполняемые с данными на SQL сервере, происходят в контексте транзакций. Транзакция - это групповая операция, т.е. набор действий с базой данных; самым существенным для этих действий является правило либо все, либо ни чего. Если во время выполнения данного набора действий, на каком-то этапе невозможно произвести очередное действие, то нужно выполнить возврат базы данных к начальному состоянию (произвести откат транзакции). Таким образом (при правильном планировании транзакций), обеспечивается целостность базы данных. В данном уроке объясняется, как начинать, управлять и завершать транзакции с помощью SQL выражений. А так же рассматривается вопрос об использовании транзакций в приложениях, созданных в Delphi. Вся приведенная информация касается InterBase.
SQL-выражения для управления транзакциями
Для управления транзакциями имеется три выражения:
SET TRANSACTION - Начинает транзакцию и определяет ее поведение.
COMMIT - Сохраняет изменения, внесенные транзакцией, в базе данных и завершает транзакцию.
ROLLBACK - Отменяет изменения, внесенные транзакцией, и завершает транзакцию.
Прежде всего, транзакции в Delphi бывают явные и неявные.
Явная транзакция - это транзакция, начатая и завершенная с помощью методов объекта DataBase:StartTransaction, Commit, RollBack. После начала явной транзакции, все изменения, вносимые в данные относятся к этой транзакции.
Другого способа начать явную транзакцию, нежели с использованием DataBase, нет. (Точнее говоря, такая возможность есть, но это потребует обращения к функциям API InterBase. Однако, это уже достаточно низкоуровневое программирование.) Следовательно, в рамках одного соединения нельзя начать две транзакции.
Неявная транзакция стартует при модификации данных, если в данный момент нет явной транзакции. Неявная транзакция возникает, например, при выполнении метода Post для объектов Table и Query. То есть, если Вы отредактировали запись, в DBGrid и переходите на другую запись, то это влечет за собой выполнение Post, что, в свою очередь, приводит к началу неявной транзакции, обновлению данных внутри транзакции и ее завершению. Важно отметить, что неявная транзакция, начатая с помощью методов Post, Delete, Insert, Append и т.д. заканчивается автоматически.