Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shpory_po_BD.doc
Скачиваний:
4
Добавлен:
22.09.2019
Размер:
1.37 Mб
Скачать

23.Методы управления параллельностью

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

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

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

Порядок использования блокировок:

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

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

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

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

Механизм блокировки может приводить к проблемам бесконечного ожидания и взаимной блокировки.

Пример бесконечного ожидания: Транзакция Т1 заблокировала элемент Х. Поступившая затем в систему транзакция Т2, которой также необходим элемент Х, переходит в состояние ожидания, периодически проверяя доступен ли элемент Х. В момент разблокировки в систему поступает транзакция Т3, которой требуется элемент Х, и она перехватывает инициативу по его блокировке и т.д. В таких условиях не исключена возможность, что транзакция Т2 все время будет находиться в состоянии ожидания. Чтобы избежать бесконечных ожиданий, система блокировки должна регистрировать время поступающих запросов и предоставлять им возможность блокировки ресурсов по правилу FIFO.

Тупиковые ситуации возникают при блокировке общих элементов. Например, параллельно запущены две программы.

Программа 1 Программа 2

блокировать элемент А блокировать элемент В

читать А читать В

блокировать элемент В блокировать элемент А

читать В читать А

обработка А и В обработка А и В

записать А записать В

снять блокировку А снять блокировку В

снять блокировку В снять блокировку А

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]