
- •Файл-серверные приложения
- •3. Представления
- •5. Определение триггера в стандарте языка sql
- •Типы триггеров
- •6. Понятие хранимой процедуры
- •Типы хранимых процедур
- •7. Табличные переменные
- •Функции пользователя
- •8. Понятие курсора
- •Вложенные транзакции
- •10. Параллельная работа транзакций
- •Работа транзакций в смеси
- •Проблемы параллельной работы транзакций
- •Проблема потери результатов обновления.
- •Проблема незафиксированной зависимости (чтение "грязных" данных).
- •Проблема несовместимого анализа данных.
- •11. 1. Проблема потери результатов обновления
- •12. Проблема незафиксированной зависимости (чтение "грязных" данных)
- •13. 3.1. Неповторяемое считывание
- •14. Фиктивные элементы (фантомы)
- •15. Несовместимый анализ данных
- •16. Конфликты между транзакциями
- •17. Модель конфликтов транзакций. Граф предшествования
- •18. Типы блокировок.
- •19. Решение проблем параллелизма при помощи блокировок
- •Проблема потери результатов обновления
- •Проблема незафиксированной зависимости (чтение "грязных" данных)
- •Проблема несовместимого анализа Неповторяемое считывание
- •Фиктивные элементы (фантомы)
- •Несовместимый анализ данных
- •Разрешение тупиковых ситуаций
- •20.Разрешение тупиковых ситуаций. Граф ожидания.
- •21.Назначение многомерных бд. Структурные компоненты многомерной модели.
- •Основные преимущества многомерных субд
- •22. Агрегация данных в многомерных базах данных.
- •Существует частичная и полная агрегация.
- •24. Организация запросов средствами языка mdx.
19. Решение проблем параллелизма при помощи блокировок
Проанализируем, поведение транзакций, вступающих в конфликт при доступе к одним и тем же данным.
Проблема потери результатов обновления
Две транзакции по очереди записывают некоторые данные в одну и ту же строку и фиксируют изменения.
Время |
Транзакция 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-блокировка - недоступна |
--- |
|
Ожидание… |
Откат транзакции (Блокировка снимается) |
|
S-блокировка - доступна |
--- |
|
Чтение |
--- |
|
Работа с прочитанными
данными
|
--- |
|
--- |
--- |
|
COMMIT |
--- |
|
Все правильно |
|
Результат. Транзакция A притормозилась до окончания (отката) транзакции B. После этого транзакция A продолжила работу в обычном режиме и работала с правильными данными. Конфликт разрешен за счет некоторого увеличения времени работы транзакции A (потрачено время на ожидание снятия блокировки транзакцией B).
Проблема несовместимого анализа Неповторяемое считывание
Транзакция A дважды читает одну и ту же строку. Между этими чтениями вклинивается транзакция B, которая изменяет значения в строке.
Время |
Транзакция A |
Транзакция B |
|
S-блокировка - доступна |
--- |
|
Чтение |
--- |
|
--- |
X-блокировка - недоступна |
|
--- |
Ожидание… |
|
Повторное чтение |
Ожидание… |
|
COMMIT (Блокировка снимается) |
Ожидание… |
|
--- |
X-блокировка - доступна |
|
--- |
Запись |
|
--- |
COMMIT (Блокировка снимается) |
|
Все правильно |
|
Результат. Транзакция B притормозилась до окончания транзакции A. В результате транзакция A дважды читает одни и те же данные правильно. После окончания транзакции A, транзакция B продолжила работу в обычном режиме.