Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курс лекций СБД.doc
Скачиваний:
23
Добавлен:
13.11.2019
Размер:
1.94 Mб
Скачать
    1. Параллельная обработка данных

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

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

      1. Потеря обновления

Предположим, что выполняются две транзакции, Т1 и Т2, состоящие из следующих команд.

Т1: UPDATE ACCOUNTS SET BALANCE = BALANCE +100 WHERE ACCNO =1234;

Т2: UPDATE ACCOUNTS SET BALANCE = BALANCE + 200 WHERE ACCNO = 1234;

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

  1. Т1 считывает запись счета 1234. Значение баланса равно 150.

  2. Т2 считывает запись счета 1234. Значение баланса равно 150.

  3. Т1 увеличивает баланс счета до 250 (150 + 100).

  4. Т2 увеличивает баланс счета до 350 (150 + 200).

  5. Т1 заносит на диск запись с балансом 250.

  6. Т2 заносит на диск запись с балансом 350.

Итоговое значение баланса должно равняться 450, а не 350! Обновление, выполненное транзакцией Т1, оказалось потерянным.

      1. Зависимость от незафиксированных обновлений

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

Т1: UPDATE ACCOUNTS SET BALANCE = BALANCE – 100 WHERE ACCNO =1234; IF BALANCE<0.00 THEN ROLLBACK ELSE COMMIT;

Т2: DELETE FROM ACCOUNTS WHERE BALANCE<0.00;

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

  1. Т1 извлекает счет 1234. Значение баланса 50.

  2. Т1 уменьшает значение баланса на 100, он становится равным –50.

  3. Т1 заносит в базу данных запись со значением –50.

  4. Т2 извлекает счет 1234. Баланс равен –50.

  5. Т2 удаляет счет 1234, так как он имеет отрицательный баланс.

  6. Т1 выполняет отмену обновления, но уже поздно – счет уже удален!

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