Блокировка записи

Решение для одновременного доступа к базе данных

Блокировка записей — это метод предотвращения одновременного доступа к данным в базе данных с целью предотвращения получения противоречивых результатов.

Классический пример демонстрируется двумя банковскими служащими, пытающимися обновить один и тот же банковский счет для двух разных транзакций. Клерки 1 и 2 оба извлекают (т. е. копируют) запись счета . Клерк 1 применяет и сохраняет транзакцию. Клерк 2 применяет другую транзакцию к своей сохраненной копии и сохраняет результат на основе исходной записи и своих изменений, перезаписывая транзакцию, введенную клерком 1. Запись больше не отражает первую транзакцию, как будто ее никогда не было.

Простой способ предотвратить это — заблокировать файл всякий раз, когда запись изменяется любым пользователем, так что никакой другой пользователь не сможет сохранить данные. Это предотвращает некорректную перезапись записей, но позволяет обрабатывать только одну запись за раз, блокируя других пользователей, которым нужно редактировать записи в то же время.

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

В теории управления базами данных блокировка используется для реализации изоляции между несколькими пользователями базы данных. Это «I» в аббревиатуре ACID .

Подробное и авторитетное описание блокировки было написано Джимом Греем . [1]

Степень детализации блокировок

Если банковские служащие (следуя иллюстрации выше) обслуживают двух клиентов, но их счета содержатся в одной книге, то вся книга или одна или несколько таблиц базы данных должны быть доступны для редактирования служащим, чтобы каждый мог завершить транзакцию по одной за раз ( блокировка файлов ). Хотя этот метод безопасен, он может привести к ненужному ожиданию.

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

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

В базе данных SQL запись обычно называется «строкой».

Введение гранулярных (подмножественных) блокировок создает возможность для ситуации, называемой взаимоблокировкой . Взаимная блокировка возможна, когда используется инкрементальная блокировка (блокировка одного объекта, затем блокировка одного или нескольких дополнительных объектов). Для иллюстрации, если два клиента банка попросили двух клерков получить информацию об их счетах, чтобы они могли перевести деньги на другие счета, два счета, по сути, были бы заблокированы. Затем, если клиенты сказали своим клеркам, что деньги должны быть переведены на счета друг друга, клерки искали бы другие счета, но обнаружили бы, что они «используются», и ждали бы их возврата. Неосознанно два клерка ждут друг друга, и ни один из них не может завершить свою транзакцию, пока другой не сдастся и не вернет счет. Для избежания таких проблем используются различные методы.

Использование замков

Блокировки записей должны управляться между сущностями, запрашивающими записи, так, чтобы ни одна сущность не получала слишком много услуг через последовательные гранты , и ни одна другая сущность не была эффективно заблокирована. Сущности, запрашивающие блокировку, могут быть как отдельными приложениями (программами), так и целым процессором.

Приложение или система должны быть спроектированы таким образом, чтобы любая блокировка удерживалась в течение как можно более короткого времени. Чтение данных без возможности редактирования не требует блокировки, а чтение заблокированных записей обычно допустимо.

Можно заказать два основных типа замков:

Эксклюзивные замки

Эксклюзивные блокировки удерживаются исключительно одним субъектом, обычно для записи в запись. Если бы схема блокировки была представлена ​​списком, список держателей содержал бы только одну запись. Поскольку этот тип блокировки эффективно блокирует любую другую сущность, которая требует блокировки для обработки, необходимо соблюдать осторожность, чтобы:

  • убедитесь, что блокировка удерживается в течение как можно более короткого времени;
  • не удерживать блокировку во время вызовов системы или функций, когда сущность больше не выполняется на процессоре — это может привести к взаимоблокировке;
  • гарантировать, что если сущность неожиданно выйдет из работы по какой-либо причине, блокировка будет снята.

Не держатели блокировки (т. н. ожидающие ) могут быть включены в список, который обслуживается по принципу циклического обслуживания или в очередь FIFO . Это гарантирует, что любой возможный ожидающий получит равные шансы получить блокировку и не будет заблокирован. Для дальнейшего ускорения процесса, если сущность заснула в ожидании блокировки, производительность повышается, если сущность уведомлена о предоставлении, а не обнаруживает ее при каком-то системном тайм-ауте, управляемом пробуждением.

Общие замки

Общие блокировки отличаются от исключительных тем, что список владельцев может содержать несколько записей. Общие блокировки позволяют всем владельцам читать содержимое записи, зная, что запись не может быть изменена до тех пор, пока блокировка не будет снята всеми владельцами. Исключительные блокировки не могут быть получены, когда запись уже заблокирована (исключительно или совместно) другим субъектом.

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

Смотрите также

Ссылки

  1. ^ Грей, Джим и Рейтер, f (1993), Распределенная обработка транзакций: концепции и методы, Morgan Kaufmann, стр. 375–437, ISBN 1-55860-190-2
Retrieved from "https://en.wikipedia.org/w/index.php?title=Record_locking&oldid=1268930049"