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

10. Транзакции и параллельные вычисления

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

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

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

Решение проблемы состоит в том, чтобы в тот или иной момент времени только один поток мог обращаться к файлу.

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

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

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

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

10.1. Параллельные запросы

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

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

  • Менеджер транзакций. Выполняет координацию работы транзакций.

  • Планировщик (менеджер блокировки). Отвечает за реализацию выбранной стратегии управления параллельностью.

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

  • Менеджер буферов. Отвечает за передачу данных между основной памятью компьютера и дисковой памятью.

Параллелизм – это сложная проблема для СУБД. MySQL является многопотоковой программой, поэтому она вынуждена справляться с множественными запросами на подключение. Но помимо проблемы подключения существует еще и проблема одновременного (параллельного) доступа к данным.

Программисты решают проблемы параллельного доступа с помощью блокировок.

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

Технология использования блокировки:

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

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

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

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

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

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

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

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