Блокировка записи
Эта статья нуждается в дополнительных цитатах для проверки . ( декабрь 2009 г. ) |
Блокировка записей — это метод предотвращения одновременного доступа к данным в базе данных для предотвращения противоречивых результатов.
Классический пример демонстрируется двумя банковскими служащими, пытающимися обновить один и тот же банковский счет для двух разных транзакций. счета Клерки 1 и 2 извлекают (т. е. копируют) запись . Клерк 1 применяет и сохраняет транзакцию. Клерк 2 применяет другую транзакцию к своей сохраненной копии и сохраняет результат на основе исходной записи и своих изменений, перезаписывая транзакцию, введенную клерком 1. Запись больше не отражает первую транзакцию, как если бы она никогда не происходила.
Простой способ предотвратить это — блокировать файл каждый раз, когда запись изменяется каким-либо пользователем, чтобы ни один другой пользователь не мог сохранить данные. Это предотвращает неправильную перезапись записей, но позволяет обрабатывать только одну запись одновременно, блокируя других пользователей, которым необходимо редактировать записи одновременно.
Чтобы позволить нескольким пользователям одновременно редактировать таблицу базы данных, а также предотвратить несоответствия, возникающие из-за неограниченного доступа, одну запись можно заблокировать при ее извлечении для редактирования или обновления. Любому, кто попытается получить ту же запись для редактирования, будет отказано в доступе на запись из-за блокировки (хотя, в зависимости от реализации, они могут просматривать запись, не редактируя ее). После сохранения записи или отмены изменений блокировка снимается. Записи никогда не могут быть сохранены, чтобы перезаписать другие изменения, сохраняя целостность данных .
В теории управления базами данных блокировка используется для реализации изоляции между несколькими пользователями базы данных. Это «Я» в аббревиатуре ACID .
Подробное и авторитетное описание блокировки написал Джим Грей . [1]
Зернистость замков
[ редактировать ]Если банковские служащие (как показано на рисунке выше) обслуживают двух клиентов, но их счета содержатся в одном регистре, то весь регистр или одна или несколько таблиц базы данных должны быть доступны для редактирования служащим, чтобы для каждого завершения транзакции по одному ( блокировка файлов ). Хотя этот метод безопасен, он может вызвать ненужное ожидание.
Если служащие могут удалить из книги одну страницу, содержащую учетную запись текущего клиента (а также несколько других учетных записей), то одновременно можно обслуживать несколько клиентов , при условии, что учетная запись каждого клиента находится на отдельной странице, чем другие. Если у двух клиентов есть аккаунты на одной странице, то одновременно можно обслуживать только одного. Это аналогично блокировке уровня страницы в базе данных.
Более высокая степень детализации достигается, если каждый отдельный счет может вестись клерком. Это позволит любому клиенту обслуживаться, не дожидаясь, пока другой клиент получит доступ к другой учетной записи. Это аналогично блокировке уровня записи и обычно представляет собой наивысшую степень детализации блокировки в системе управления базой данных.
В базе данных SQL запись обычно называется «строкой».
Введение гранулярных (подмножественных) блокировок создает возможность возникновения ситуации, называемой взаимоблокировкой . Взаимная блокировка возможна, когда инкрементная блокировка используется (блокировка одного объекта, а затем блокировка одного или нескольких дополнительных объектов). Например, если два клиента банка попросят двух клерков получить информацию об их счетах, чтобы они могли перевести деньги на другие счета, эти два счета по сути будут заблокированы. Затем, если клиенты сообщают своим клеркам, что деньги должны быть переведены на счета друг друга, клерки будут искать другие счета, но обнаруживают, что они «используются», и ждут их возврата. Сам того не зная, два клерка ждут друг друга, и ни один из них не может завершить транзакцию, пока другой не сдастся и не вернет счет. Чтобы избежать подобных проблем, используются различные методы.
Использование замков
[ редактировать ]Блокировками записей необходимо управлять между объектами, запрашивающими записи, так, чтобы ни одному объекту не предоставлялось слишком много услуг посредством последовательных грантов , и ни один другой объект не был эффективно заблокирован. Объектами, запрашивающими блокировку, могут быть как отдельные приложения (программы), так и целый процессор.
Приложение или система должны быть спроектированы таким образом, чтобы любая блокировка удерживалась в течение как можно более короткого времени. Чтение данных без средств редактирования не требует блокировки, а чтение заблокированных записей обычно допустимо.
Могут быть запрошены два основных типа замков:
Эксклюзивные замки
[ редактировать ]Эксклюзивные блокировки принадлежат исключительно одному объекту, обычно с целью записи в запись. Если бы схема блокировки была представлена списком, список держателей содержал бы только одну запись. Поскольку этот тип блокировки эффективно блокирует обработку любого другого объекта, которому требуется блокировка, необходимо соблюдать осторожность, чтобы:
- убедитесь, что блокировка удерживается как можно более короткое время;
- не удерживать блокировку при вызовах системы или функций, когда объект больше не работает на процессоре — это может привести к взаимоблокировке;
- убедитесь, что в случае неожиданного выхода из объекта по какой-либо причине блокировка будет снята.
Не держатели блокировки (так называемые официанты ) могут храниться в списке, который обслуживается по круговому принципу, или в очереди FIFO . Это гарантировало бы, что любой возможный официант получит равные шансы получить замок и не будет заблокирован. Чтобы еще больше ускорить процесс, если объект перешел в спящий режим в ожидании блокировки, производительность повышается, если объект уведомляется о предоставлении, а не обнаруживает его при каком-то пробуждении, вызванном тайм-аутом системы.
Общие блокировки
[ редактировать ]Общие блокировки отличаются от исключительных блокировок тем, что список владельцев может содержать несколько записей. Общие блокировки позволяют всем владельцам читать содержимое записи, зная, что запись не может быть изменена до тех пор, пока блокировка не будет снята всеми владельцами. Эксклюзивная блокировка не может быть получена, если запись уже заблокирована (эксклюзивно или совместно) другим объектом.
Если запросы на блокировку для одного и того же объекта поставлены в очередь, то после предоставления общей блокировки также могут быть предоставлены любые находящиеся в очереди общие блокировки. Если следующей в очереди обнаружена эксклюзивная блокировка, она должна подождать, пока не будут сняты все общие блокировки. Как и в случае с эксклюзивными блокировками, эти общие блокировки следует удерживать как можно меньше времени.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Грей, Джим и Рейтер, Андреас (1993), Распределенная обработка транзакций: концепции и методы , Морган Кауфманн, стр. 375–437 , ISBN 1-55860-190-2