Необходимость управления параллельностью
Управление параллельностью – процесс организации одновременного выполнения в базе данных различных операций, гарантирующих исключение их взаимного влияния друг на друга.
Важнейшей целью создания БД является организация параллельного доступа многих пользователей к общим данным, используемыми ими совместно. Обеспечить параллельный доступ относительно несложно, если все пользователи будут только читать данные, помещенные в базу. В этом случае работа каждого из них не оказывает никакого влияния на работу остальных пользователей. Однако, если два и более пользователей одновременно обращаются к базе данных и хотя бы один из них хочет обновить хранимую в базу информацию, возможно взаимное влияние процессов друг на друга, способное привести к несогласованности данных. Существуют три проблемы параллельности (возникающие при параллельной обработке транзакций):
1.
Проблема потери результатов обновления;
Рассмотрим ситуацию, когда транзакция А считывает некоторый кортеж t в момент t1, а транзакция В считывает этот же кортеж t в момент t2. Далее транзакция А обновляет кортеж t в момент t3 (исходя из значений в момент t1), а транзакция В обновляет тот же кортеж t в момент t4 (исходя из значений в момент t2 и аналогичных значений, которые были считаны в момент t1).
Транзакция А | Время | Транзакция В | |||
Извлечение кортежа t | t1 | - | |||
- | t2 | Извлечение кортежа t | |||
Обновление кортежа t | t3 | - | |||
- | t4 | Обновление кортежа t | |||
- | t5 | - |
Результат операции обновления, выполненной транзакцией А, будет утерян, поскольку в момент t4 он будет перезаписан транзакцией В.
2. Проблема незафиксированной зависимости (чтение “грязных” данных, неаккуратное считывание);
Может возникнуть в том случае, если любой транзакции разрешено считывание или обновление кортежа, который только что был обновлен другой транзакцией, но результаты выполнения этой транзакции еще не были зафиксированы. Если некоторое обновление не зафиксировано, то существует определенная вероятность, что оно не будет зафиксировано никогда из-за отката данной транзакции.
Пример 1
Транзакция А |
Время |
Транзакция В |
t1 |
Обновление кортежа t |
|
Извлечение кортежа t |
t2 |
- |
- |
t3 |
Откат транзакции |
- |
t4 |
- |
Пример 2
Транзакция А |
Время |
Транзакция В |
t1 |
Обновление кортежа t |
|
Обновление кортежа t |
t2 |
- |
- |
t3 |
Откат транзакции |
- |
t4 |
- |
3. Проблема несовместимого анализа;
Включает 3 варианта:
1. Неповторяемое считывание;
2. Фиктивные элементы фантомы;
3. Собственно несовместимый анализ.
1. Неповторяемое считывание:
Транзакция А дважды читает одну и ту же строку, между этими чтениями и вклинивается транзакция В, которая изменяет значение строки. Транзакция А ничего не знает о существовании транзакции В. А т.к. сама ничего не меняла, то и ожидает, что значение при повторном чтении будет тем же. С точки зрения транзакции А происходит самопроизвольное изменение данных.
Транзакция А |
Время |
Транзакция В |
Чтение p ® 100 |
t1 |
- |
- |
t2 |
Чтение p ® 100 |
- |
t3 |
Запись 200 ® p |
- |
t4 |
Фиксация транзакции |
Чтение p ® 200 |
t5 |
- |
Фиксация транзакции |
t6 |
- |
Эффект фиктивных элементов фантомов наблюдается, когда происходит чтение нескольких строк, удовлетворяющих некоторому условию:
Транзакция А производит считывание строк с одним и тем же условием. Например, считывает результаты экзамена студентов группы ИС-01. В это время вклинивается транзакция В и вставляет или удаляет n-ое количество строк. При повторном считывании транзакция А видит другое количество строк.
Транзакция А ничего не знает о существовании В и не может понять, что происходит с данными.
Транзакция А |
Время |
Транзакция В |
Выборка строк, удовлетворяющих некоторому условию : результат n строк |
t1 |
- |
- |
t2 |
Вставка строк, удовлетворяющих условию |
- |
t3 |
Фиксация транзакции |
Выборка строк, удовлетворяющих условию : результат n+1 строк |
t4 |
- |
3. Собственно несовместимый анализ:
В смеси транзакций присутствуют 2 транзакции: короткая и длинная.
Транзакция А |
Время |
Транзакция В |
Чтение счета p1=100 и Sum=100 |
t1 |
- |
- |
t2 |
Снятие денег со счета p3: 100 ® 50 |
- |
t3 |
Помещение денег на счет p1 |
- |
t4 |
Фиксация транзакции |
Чтение счета p2=100 и Sum=200 |
t5 |
|
Чтение счета p3=50 и Sum=250 |
t6 |
|
Фиксация транзакции |
t7 |
Таким образом, рассмотренные коллизии показывают, что если не принимать определенных мер, то нарушится одно из важнейших свойств изолированности транзакций. Очевидно, что транзакции не будут мешать друг другу, если они выполняются в разное время и работают с разными данными.