времени и ресурсов системы.
•
За возникновением тупиковой ситуации следит сама СУБД, она же
принимает решение, какой транзакцией пожертвовать. Этот способ
характерен для промышленных СУБД (ORACLE, MS SQL Server и т.п.).
В этом случае система сама следит за возникновением ситуации тупика,
путем построения (или постоянного поддержания) графа ожидания
транзакций. Граф ожидания транзакций - это ориентированный
двудольный граф, в котором существует два типа вершин: вершины,
соответствующие транзакциям, и вершины, соответствующие объектам
захвата. Ситуация тупика возникает, если в графе ожидания транзакций
имеется хотя бы один цикл. Одну из транзакций, попавших в цикл,
необходимо откатить, причем, система сама может выбрать эту
транзакцию в соответствии с некоторыми стоимостными соображениями
(например, самую короткую, или с минимальным приоритетом и т.п.).
3) Если рассматривать только блокировки данных по строкам таблицы, то
при использовании приведенного выше протокола доступа к данным не
решается проблема фантомов. Например, при добавлении новой строки в
таблицу, т.к. эта строка может быть добавлена транзакцией B после
выполнения транзакцией A всех своих блокировок на первом цикле обработки,
а на втором цикле обработки в транзакции A будут получены новые данные.
Для решения этой проблемы можно использовать блокировки более крупных
объектов БД (всей БД, файлов, таблиц (LOCK TABLE), страниц, строк, полей),
либо совместное использование блокировок объектов разной величины.
Чем крупнее объект блокировки, тем меньше возможностей для
параллельной работы. Достоинством блокировок крупных объектов является
уменьшение накладных расходов системы и решение проблем, не решаемых с
использованием блокировок менее крупных объектов. Например,
использование монопольной блокировки на уровне таблицы, очевидно, решит
проблему фантомов, приведенную выше. Современные СУБД, как правило,
поддерживают минимальный уровень блокировки на уровне строк или страниц.
167