Блокировка базы данных - PullRequest
2 голосов
/ 10 марта 2011

Привет. Я пытаюсь посмотреть, что блокирует базу данных, и нашел 2 типа блокировки. Оптимистичная и пессимистическая блокировка. Я нашел несколько статей на Wiki, но я хотел бы узнать больше! Может кто-нибудь объяснить мне о тех блокировках? Мы должны использовать блокировку только тогда, когда нам нужен эксклюзивный доступ к чему-либо? Блокировка происходит только тогда, когда мы используем транзакцию? Заранее спасибо.

Kevin

Ответы [ 2 ]

4 голосов
/ 10 марта 2011

Оптимистическая блокировка вообще не блокируется.

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

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

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

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

Мы должны использовать блокировку только тогда, когда нам нужен эксклюзивный доступ к чему-либо?

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

Блокировка происходит только тогда, когда мы используем транзакцию?

Да.Во время выполнения транзакции вы будете накапливать блокировки, освобождая их в конце.Обратите внимание, что одна команда SQL в режиме автоматической фиксации все еще является транзакцией сама по себе.

0 голосов
/ 23 марта 2011

Уровни изоляции транзакций также определяют поведение блокировки.BOL означает: Управление уровнями изоляции транзакций:

Взятые ли блокировки при чтении данных и какой тип блокировки запрашивается.

Как долго удерживаются блокировки чтения.

Операция чтения, ссылающаяся на строки, измененные другой транзакцией:

Блокирует до тех пор, пока не будет снята монопольная блокировка строки.

Извлекает зафиксированную версию строки, которая существовала на момент выполнения оператора илитранзакция запущена.

Считывает незафиксированное изменение данных.

Уровни по умолчанию: Чтение незафиксировано (самый низкий уровень, когда транзакции изолированы только для того, чтобы физически поврежденные данные не читались)

Чтение зафиксировано (уровень по умолчанию для компонента Database Engine)

Повторяемое чтение

Сериализуемый (самый высокий уровень, когда транзакции полностью изолированы друг от друга)

...