Транзакции и параллельный доступ к базе данных

Современные СУБД являются многопользовательскими системами, т.е. допускают одновременную работу большого количества пользователей. При этом пользователи не должны мешать друг другу. Трудность состоит в том, что если не предпринимать никаких специальных мер, то данные, измененные одним пользователем, могут быть изменены другим пользователем. В результате, в конце работы с данными первый пользователь увидит не результаты своей работы, а неизвестно что. Если в системе управления базами данных не реализованы специальные механизмы, то при одновременном чтении и изменении одних и тех же данных несколькими пользователями могут возникнуть проблемы одновременного доступа.

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

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

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

Существует два способа обеспечить независимую параллельную работу нескольких транзакций. Одним из способов является метод блокировок. Второй способ блокировки не использует. Эти способы в

Теории управления параллелизмом получили название:

  • • Пессимистическое управление параллелизмом;
  • • Оптимистическое управление параллелизмом.

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

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

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

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

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ   След >