Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpory_po_bd.docx
Скачиваний:
32
Добавлен:
26.09.2019
Размер:
126.45 Кб
Скачать

20 Управл парал-ной обработкой данных. Блокировки

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

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

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

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

При параллельной обработке транзакций возможно возникновение следующих проблем:

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

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

  • изменить значение этой переменной;

  • сохранить измененное значение в таблице.

Иными словами, в начале транзакции выполняется оператор SELECT, а в конце – оператор UPDATE.

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

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

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

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

Строки – фантомы. Если одна из транзакций несколько раз выполняет один и тот же запрос, может получиться, что результаты выполнения этого запроса будут различными. Так, может произойти ситуация, когда перед выпиской билета кассир запрашивает количество мест каждого вида а потом спрашивает у покупателя, какое место тот желает. При повторном запросе желаемого места его может и не оказаться!

Согласование и изоляция транзакций

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

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

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

Другим понятием, которое характеризует взаимодействие транзакций друг с другом, является понятие уровня изоляции транзакции.

Стандарт SQL допускает 4 уровня изоляции транзакций. Каждый из последующих уровней является более «слабым» по сравнению с предыдущими, поскольку допускает возникновение тех или иных проблем.

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

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

«завершенное чтение» - транзакция может видеть любые изменения, выполненные уже завершившимися параллельными транзакциями, но не видит промежуточных результатов их работы.

«незавершенное чтение» -чтение тех результатов, которые могут быть отменены при откате транзакции.

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

  • для обеспечения гарантированной неизменности данных другими пользователями в рамках транзакции;

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

Можно заблокировать всю базу данных, отдельную таблицу, строку или набор строк, а также отдельные столбцы таблицы.

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

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

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

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

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