
232
Часть II. Структурированный язык запросов SQL
• изменения данных могут быть отменены одним процес-
сом, в то время как модифицированными данными уже
воспользовались для другого действия. Этот случай уже
проиллюстрирован выше, когда минимальные значения
оценок могли быть уже получены, после чего первый
пользователь произведенные изменения оценок отменил;
• одно действие может частично воздействовать на резуль-
тат другого действия. Например, при получении отчета
об успеваемости не исключено, что другим пользовате-
лем произведено удаление из списка одного или несколь-
ких студентов, а данные об их успеваемости уже могут
войти в вывод первого запроса.
• тупиковая ситуация, которая может произойти, если про-
цессы попытаться выполнить конфликтующие друг с
другом действия. Это может возникнуть, например, если
один пользователь пробует изменить значение внешнего
ключа, а другой - родительского ключа, и это происходит
одновременно.
Для исключения подобных ситуаций в SQL присутствует
средство управления параллелизмом, которое указывает
процессам точное место получения результата. Основной
принцип при этом следующий: все одновременно
выполняемые команды не будут завершены до тех пор, пока не
будут завершены предыдущие. Другими словами, система
должна обеспечивать одновременный доступ к таблице не
более чем для одной транзакции в данный момент времени.
Правда, в системах, где требуется обеспечить доступ к БД
очень большому количеству пользователей, управление
параллелизмом осуществляется по несколько видоизмененной
схеме, позволяя администратору БД и пользователям самим
регулировать степень согласованности и доступности данных.
Механизм, используемый SQL для управления параллелизмом
операций, как мы уже знаем, называется блокировкой. Блокиров-
ки задерживают определенные операции в БД, пока другие опе-
рации или транзакции не завершены. Задержанные операции по-
мещаются в очередь и выполняются только тогда, когда блоки-
ровка снята, а иногда не отклоняются системой, выдавая при этом
соответствующее предупреждение.
Блокировки в многопользовательских системах выполняются
по специальным схемам, применяемым ко всем командам в БД, и.
кроме того, снабжены средствами обнаружения блокировок, бло-
кирующих друг друга. В этом случае, одна из команд отменяется,
а следовательно, получает сброс блокировка.
Глава 2.5. Специальные аспекты работы с базами данных
233
Различают два базовых типа блокировок:
• распределяемые (нежесткие) блокировки - могут быть ус-
тановлены более чем одним пользователем в данный мо-
мент времени, что дает возможность любому числу про-
цессов обращаться к данным, но не изменять их;
• специальные (жесткие) блокировки - не позволяют нико-
му вообще, кроме владельца этой блокировки, обращать-
ся к данным. Специальные блокировки используются,
например, для команд, которые изменяют содержание
или структуру таблицы и действуют до конца транзакции.
В механизме реализации блокировок используется понятие
уровня изоляции блокировки, определяющее, сколько таблиц бу-
дет блокировано. Традиционно используют три уровня изоляции,
два из которых можно применить к распределенным и специаль-
ным блокировкам, а третий, так называемый ограниченный уро-
вень, служит для того, чтобы использовать эти блокировки со-
вместно. Уровни изоляции управляются командами, поданными
самим SQL.
Уровень изоляции, называемый повторное чтение, реализует
такую стратегию, что внутри данной транзакции все записи, из-
влеченные с помощью запросов, не могут быть изменены. По-
скольку записи, модифицируемые в транзакции, подвергаются
специальной блокировке, они не могут быть изменены до тех
пор, пока транзакция не завершена. С другой стороны, для запро-
сов повторное чтение означает то, что можно решить заранее,
какие записи будут модифицированы, и заблокировать тот про-
цесс, которому необходимо их выбрать. Таким образом, при вы-
полнении запроса гарантируется, что никакие изменения не будут
сделаны в этих записях до тех пор, пока не завершится текущая
транзакция. Однако повторное чтение, защищающее процесс,
который установил блокировку, в то же время может в значи-
тельной мере снизить производительность работы с данными.
Уровень изоляции, который называют указатель стабильно-
сти, предохраняет каждую запись от изменений на время, когда
она считывается, или от чтения на время ее изменения. Во втором
вариалге это является специальной блокировкой и применяется
до тех пер. пока изменение не будет завершено или отменено.
Следовательно, при модификации группы записей, использую-
щих, указатель стабильности, эти записи будут заблокированы,
пока транзакция не закончится, что аналогично действию, произ-
водимому уровнем повторного чтения. Различие между этими
двумя уровнями в их воздействии на запросы. В с,тучае уровня