231 • Пользователи, осуществляющие запись в БД, должны запрашивать
и получать от сервера
блокировку записи (
write lock ) для изменения
данных. А пользователи, считывающие данные из БД, должны за
прашивать и получать от сервера
блокировку чтения (
read lock )
для осуществления запросов к данным. В то время как чтение мо
жет осуществляться одновременно несколькими пользователями,
для каждой таблицы (или ее части) одновременно выдается только
одна блокировка записи, и запросы на чтение блокируются до тех
пор, пока не будет снята блокировка записи.
• Пользователи, осуществляющие запись в БД, для изменения дан
ных должны запрашивать и получать от сервера блокировку запи
си, но пользователи, считывающие данные, для запроса данных не
нуждаются ни в каком типе блокировки. Вместо этого сервер гаран
тирует, что читатель видит непротиворечивое представление дан
ных (данные представляются неизменными, даже несмотря на то,
что другие пользователи могут их модифицировать), начиная с мо
мента начала запроса до его завершения. Этот подход известен как
контроль версий (
versioning ).
У обеих стратегий есть свои достоинства и недостатки. При первом под
ходе время ожидания может оказаться длительным, если одновремен
но поступило много запросов на чтение и запись. Второй подход может
создать проблемы в случае длительных запросов, поскольку происхо
дит изменение данных. В данной книге обсуждаются три сервера: Mi
crosoft SQL Server использует первый подход, Oracle Database – вто
рой, а MySQL – оба подхода (в зависимости от выбранного пользовате
лем
механизма хранения (
storage engine ), который обсуждается не
много позже).
Также есть ряд различных стратегий блокировки ресурса. Блокирова
ние может выполняться на одном из трех разных уровней, или с одной
из трех
детализаций (
granularities ):
Блокирование таблицы Предотвращает одновременное изменение несколькими пользова
телями данных одной таблицы.
Блокирование страницы Предотвращает одновременное изменение несколькими пользова
телями данных одной страницы таблицы (страница – сегмент памя
ти, обычно от 2 до 16 Кбайт).
Блокирование строки Предотвращает одновременное изменение несколькими пользова
телями одной строки таблицы.
У этих подходов тоже есть свои плюсы и минусы. При блокировке всей
таблицы возникает очень мало промежуточных результатов, но по мере
роста числа пользователей такая блокировка очень быстро приводит