Что такое взаимная блокировка?
Что такое взаимная блокировка?
Взаимная блокировка является просто сокращенным названием, заимствованным из реслинга, для условия, когда две транзакции борются за изменение строк в перекрывающихся наборах и ни одна транзакция не имеет приоритета перед другой.
Например, наша транзакция имеет изменения, ожидающие завершения, для строки x и собирается изменять строку Y в то время, как другая транзакция имеет изменения, ожидающие завершения, для строки Y и собирается изменять строку x, и обе транзакции имеют режим WAIT. Как и в реслинге, взаимная блокировка может быть разрешена, только если один из борцов не удержит руку. Одна транзакция должна выполнить откат, чтобы позволить другой подтвердить свои изменения.
Firebird предоставляет приложениям средство разрешения взаимной блокировки путем сканирования блокировок каждые несколько секунд. Он произвольно выберет одну из транзакций -взаимной блокировки и выдаст для нее исключение взаимной блокировки.
Разработчики не должны бояться сообщений о взаимной блокировке. Наоборот, имеет смысл изолировать работу многих пользователей в контекстах транзакций. Вы должны допускать наличие взаимных блокировок и эффективно их обрабатывать в вашем приложении.
Если наша транзакция выбрана для разрешения взаимной блокировки, обработчик исключения в приложении должен выполнить откат транзакции, чтобы позволить другой транзакции возобновить и завершить свою работу. Альтернатива - подтверждение транзакции в обработчике исключения - не рекомендуется, поскольку наша транзакция станет неатомарной, а другая транзакция даст сбой по конфликту блокировки.
Тупиковая ситуация
В редких случаях более двух транзакций может быть включено во взаимную блокировку при борьбе за перекрывающиеся наборы. Иногда это называется тупиковой ситуацией (программистский жаргон - deadly embrace, смертельные объятия). Сканирование блокировок выберет одну транзакцию (нашу транзакцию), ситуация будет обработана в клиентском обработчике исключений, как в предыдущем примере. При этом даже если клиент выполнит откат нашей транзакции, те другие транзакции все еще останутся заблокированными.
Активный тупик
Клиент может запустить новую транзакцию и повторить попытку, однако другие соперники все еще находятся в состоянии взаимной блокировки, ожидая следующего сканирования блокировок для освобождения следующего соперника с выдачей исключения блокировки. Если приложение повторяет попытку с транзакцией WAIT, он просто ждет бесконечное время, когда будет разрешена тупиковая ситуация с другими транзакциями. Про транзакцию с такими тщетными попытками повтора говорят, что она находится в активном тупике.
Короче говоря, важно в первую очередь исключить контексты транзакций, которые могут привести к тупиковой ситуации. В качестве дополнительной защиты обработчики исключений должны быть способны быстро обрабатывать блокировки и обеспечивать, чтобы проблемные транзакции завершались чисто и без задержек.
Пора дальше
Далее мы рассмотрим транзакции с точки зрения разработчика клиентских приложений. Темы в этой главе являются нейтральными к включающим языкам. Тем не менее все современные средства разработки приложений и драйверы для Firebird используют один и тот же API в той или иной форме, что хорошо для одного, хорошо и для другого.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Ждущая блокировка
Ждущая блокировка QNX предоставляет упрощенный вариант использования условной переменной для блокирования (остановки) потока при помощи интерфейса так называемой ждущей блокировки (sleepon). Для использования этого механизма не нужно явно создавать никаких объектов
13.3.2. Блокировка записей
13.3.2. Блокировка записей С целью преодоления проблем, присущих блокировочным файлам, в System V и BSD 4.3 была добавлена блокировка записей, реализуемая с помощью системных вызовов lockf() и flock() соответственно. Стандарт POSIX определил третий механизм для блокировки записей, который
Блокировка SuperFetch
Блокировка SuperFetch Функция SuperFetch позволяет ускорить работу системы за счет использования части оперативной памяти для кэширования данных, используемых при загрузке ОС и запуске приложений.В реестре за настройки функции отвечает ключ
15.17.4 Блокировка файлов
15.17.4 Блокировка файлов К некоторым файлам могут одновременно обратиться несколько пользователей. Например, конфигурационные файлы могут читаться несколькими процессами. Для изменения совместно используемого файла пользователь должен получить специальные полномочия
Блокировка слоев
Блокировка слоев Блокировку слоев полезно применять в случаях, когда требуется редактирование объектов, расположенных на определенных слоях, с возможностью просмотра объектов на других слоях. Редактировать объекты на заблокированных слоях нельзя. Однако они остаются
7.4. Блокировка и ожидание
7.4. Блокировка и ожидание Продемонстрируем теперь, что взаимные исключения предназначены для блокирования, но не для ожидания. Изменим наш пример из предыдущего раздела таким образом, чтобы потребитель запускался сразу же после запуска всех производителей. Это даст
9.4. Рекомендательная блокировка
9.4. Рекомендательная блокировка Блокировка записей по стандарту Posix называется рекомендательной. Ядро хранит информацию обо всех заблокированных различными процессами файлах, но оно не предотвращает запись в заблокированный на чтение процесс. Ядро также не
10.1.6. Блокировка файлов
10.1.6. Блокировка файлов В тех операционных системах, которые поддерживают такую возможность, метод flock класса File блокирует или разблокирует файл. Вторым параметром может быть одна из констант File::LOCK_EX, File::LOCK_NB, File::LOCK_SH, File::LOCK_UN или их объединение с помощью оператора ИЛИ.
Блокировка строки
Блокировка строки В MGA наличие ожидающих завершения новых версий строки имеет следствием блокировку строки. При большинстве условий наличие новой подтвержденной версии блокирует запрос на изменение или удаление этой строки - это конфликт блокировки.При получении
Пессимистическая блокировка
Пессимистическая блокировка В пессимистической блокировке СУБД строки, запрошенные одним пользователем или транзакцией для операции, которая может изменить состояние данных, немедленно становятся недоступными для чтения или записи другим пользователям или
Блокировка слоев
Блокировка слоев Блокировку слоев полезно применять в случаях, когда требуется редактирование объектов, расположенных на определенных слоях, с возможностью просмотра объектов на других слоях. Редактировать объекты на заблокированных слоях нельзя. Однако они остаются
Блокировка слоев
Блокировка слоев Блокировку слоев полезно применять в случаях, когда требуется редактирование объектов, расположенных на определенных слоях, с возможностью просмотра объектов на других слоях. Редактировать объекты на заблокированных слоях нельзя. Однако они остаются
Блокировка
Блокировка В состав класса CFile включены методы LockRange и UnlockRange, позволяющие заблокировать один или несколько фрагментов данных файла для доступа других процессов. Если приложение пытается повторно блокировать данные, уже заблокированные раньше этим или другим
Блокировка автофокуса
Блокировка автофокуса Если в поле зрения камеры находится несколько объектов, то как ей распознать, какой из них интересует фотографа? Чтобы подсказать камере, на чем она должна сфокусироваться, существует функция так называемого запирания (блокировки) автофокуса (Autofocus
Nikon и Android: взаимная мимикрия мобильных гаджетов Андрей Васильков
Nikon и Android: взаимная мимикрия мобильных гаджетов Андрей Васильков Опубликовано 10 апреля 2014 Производители смартфонов стремительно отбирают клиентов у фирм, выпускающих фото- и видеокамеры потребительского уровня, медиаплееры и GPS-навигаторы.