• Проблема потери результатов обновления. • Проблема незафиксированной зависимости (чтение "грязных" данных, неаккуратное считывание). • Проблема несовместимого анализа. Рассмотрим подробно эти проблемы. Проблема потери результатов обновления. Две транзакции по очереди записывают некоторые данные в одну и ту же строку и фиксируют изменения. Результат. После окончания обеих транзакций, строка «Р» содержит значение «Рэ», занесенное более поздней транзакцией «В». Транзакция «А» ничего не знает о существовании транзакции «В», и естественно ожидает, что в строке «Р» содержится значение «Ррх Таким образом, транзакция «А» потеряла результаты своей работы (см. таблицу 71). Таблица 7 Потери транзакции А. Транзакция А Время j Транзакция В ! Г“"............. ' ■' ' ‘-11............ " '-'-1............. 1.................. " ...................' ■" ; Чтение Р=Р0 ti 1 Iр— t2 J Чтение P=P0 j Запись Pi—>P t3 1 r i t4 j Запись P2—>P j Фиксация транзакции tj 1 .. “ . „ iГ-^6 j Фиксация транзакции J Потеря результата обновления 1 ! Проблема незафиксированной зависимости (чтение ’’грязных” данных, неаккуратное считывание). Транзакция «В» изменяет данные в строке. После этого транзакция «А» читает измененные данные и работает с ними. Транзакция «В» откатывается и восстанавливает старые данные. С чем же работала транзакция «А»(см. таблицу 8)? 53 |
Обеспечение изолированности пользователей, таким образом, сводится к выбору подходящего (в каком-то смысле правильного) графика запуска транзакций. Одновременно с этим график запуска должен быть оптимальным в некотором смысле, например, давать минимальное среднее время выполнения транзакций каждым пользователем. Далее мы уточним понятие "правильного" графика и сделаем некоторые замечания об оптимальности. Проблемы параллельной работы транзакций Каким образом транзакции различных пользователей могут мешать друг другу? Различают три основные проблемы параллелизма: Проблема потери результатов обновления. Проблема незафиксированной зависимости (чтение "грязных" данных, неаккуратное считывание). Проблема несовместимого анализа. Рассмотрим подробно эти проблемы. Рассмотрим две транзакции, A и B, запускающиеся в соответствии с некоторыми графиками. Пусть транзакции работают с некоторыми объектами базы данных, например со строками таблицы. Операцию чтение строки будем обозначать , где прочитанное значение. Операцию записи значения в строку будем обозначать . Проблема потери результатов обновления Две транзакции по очереди записывают некоторые данные в одну и ту же строку и фиксируют изменения. Транзакция A Время Транзакция B Чтение ----Чтение Запись ----Запись Фиксация транзакции ----Фиксация транзакции Потеря результата обновления Результат. После окончания обеих транзакций, строка содержит значение , занесенное более поздней транзакцией B. Транзакция A ничего не знает о существовании транзакции B, и естественно ожидает, что в строке содержится значение . Таким образом, транзакция A потеряла результаты своей работы. Проблема незафиксированной зависимости (чтение "грязных" данных, неаккуратное считывание) Проблема потери результатов обновления Две транзакции по очереди записывают некоторые данные в одну и ту же строку и фиксируют изменения. Транзакция A Время Транзакция B S-блокировка успешна --Чтение ----S-блокировка успешна --Чтение X-блокировка отвергается --Ожидание… X-блокировка отвергается Ожидание… Ожидание… Ожидание… Ожидание… Обе транзакции успешно накладывают S-блокировки и читают объект . Транзакция A пытается наложить X-блокирокировку для обновления объекта . Блокировка отвергается, т.к. объект уже S-заблокирован транзакцией B. Транзакция A переходит в состояние ожидания до тех пор, пока транзакция B не освободит объект. Транзакция B, в свою очередь, пытается наложить Xблокирокировку для обновления объекта . Блокировка отвергается, т.к. объект уже Sзаблокирован транзакцией A. Транзакция B переходит в состояние ожидания до тех пор, пока транзакция A не освободит объект. Результат. Обе транзакции ожидают друг друга и не могут продолжаться. Возникла ситуация тупика. Проблема незафиксированной зависимости (чтение "грязных" данных, неаккуратное считывание) Транзакция B изменяет данные в строке. После этого транзакция A читает измененные данные и работает с ними. Транзакция B откатывается и восстанавливает старые данные. Транзакция A Время Транзакция B --S-блокировка успешна --Чтение --X-блокировка успешна --Запись S-блокировка отвергается --Ожидание… Откат транзакции (Блокировка снимается) |