- •Как определяются неявные ограничения целостности
- •Для чего предназначен механизм каскадных воздействий
- •Класс принадлежности между отношениями «Клиент» и «Заказ» в лабораторных работах
- •Перечислить свойства транзакции
- •Команда фиксации завершения транзакции
- •Чему способствует контролируемая избыточность данных
- •Что обеспечивает первичный ключ Целостность таблицы
- •Какая проблема возможна при параллельном выполнении транзакций
- •В какой нормальной форме находится в лабораторных работах таблица sales_order_items, которая имеет составной первичный ключ (поля id и line_id)
- •Что отражает агрегированный объект
- •Чему способствовало в файловых системах дублирование информации
- •В концептуальной модели между двумя объектами установлена связь м:м, класс принадлежности необязательный. Как это отражается в логической модели.
Какая проблема возможна при параллельном выполнении транзакций
Выделяют три вида проблем, которые могут иметь место при параллельном выполнении транзакций.
Проблема потерянного обновления. Результаты успешно завершенной операции обновления одной транзакции могут быть перекрыты результатами выполнения другой транзакции. Рассмотрим пример, в котором параллельно выполняются две транзакции. Транзакция Т1 заключается в снятии 10 р. со счета С, на котором находится 100 р., транзакция Т2 предполагает перевод на этот же счет 100 р. Если эти транзакции выполняются последовательно, одна за другой, без чередования операций, то после завершения работы на счету будет находится сумма в 190 р. Транзакции Т1 и Т2 начинаются практически одновременно, каждая из них считывает исходное значение на счету С=100 р. Затем транзакция Т2 увеличивает сумму на 100 р., записывает результат, равный 200 р. в базу. Тем временем Т1 уменьшает значение своей копии исходной суммы на 10р. и записывает полученное значение (90 р.) на счет, перекрывая результат предыдущего обновления. В результате со счета «исчезает» 100 р., добавленных при выполнении транзакции Т2. Избежать потери результатов выполнения транзакции Т2 можно, запретив транзакции Т1 считывать исходное значение вплоть до завершения выполнения транзакции Т2.
-
Время
Транзакция Т1
Транзакция Т2
Счет С
T1
Begin_transaction
100
T2
Begin_transaction
Read ( C )
100
T3
Read ( C )
C=C+100
100
T4
C=C-10
Write ( C )
200
T5
Write ( C )
Commit
90
T6
Commit
90
Проблема зависимости от нефиксированных результатов возникает в том случае, если одна из транзакций получает доступ к промежуточным результатам выполнения одной транзакции до того, как они будут зафиксированы в базе данных. В примере Т2 увеличивает значение на счете на 100 р., после чего выполнение транзакции отменяется , поэтому СУБД должна выполнить откат транзакции с восстановлением исходного значения на счету, равного 100 р. Однако, к этому моменту транзакция Т1 уже успела считать измененное значение (200 р.) и использовала именно это значение при выполнении операции снятия денег со счета, затем зафиксировала в базе данных неверный результат (190 р.). Проблему можно устранить, запретив транзакции Т1 считывать значение счета до тех пор, пока транзакция Т2 не будет либо зафиксирована, либо отменена.
-
Время
Транзакция Т1
Транзакция Т2
Счет С
T1
Begin_transaction
100
T2
Read ( C )
100
T3
C=C+100
100
T4
Begin_transaction
Write ( C )
200
T5
Read ( C )
……..
200
T6
C=C-10
Rollback
100
Т7
Write ( C )
190
Т8
Commit
190
Проблема несогласованной обработки (чтение мусора или неповторяемость чтения). Транзакции, которые только считывают информацию из базы данных, также могут давать неверные результаты, если им будут доступны для чтения промежуточные результаты одновременно выполняющихся и еще не завершенных транзакций, обновляющих информацию в базе. В примере транзакция Т2 вычисляет общую сумму на счетах и выполняется параллельно с Т1, которая переводит 10 р. со счета С1 на счет С3. В результате вычисленное общее значение оказывается завышенным на 10 р. Проблему можно устранить, запретив транзакции Т2 считывать значения на счетах С2 и С3 до тех пор, пока транзакция Т1 не зафиксирует выполненные ею обновления.
-
Время
Транзакция Т1
Транзакция Т2
Счет С1
Счет С2
Счет С3
Sum
T1
Begin_transaction
100
50
25
T2
Begin_transaction
Sum=0
100
50
25
0
T3
Read ( C1 )
Read ( C1 )
100
50
25
0
T4
C1=C1-10
Sum=Sum+C1
100
50
25
100
T5
Write ( C1 )
Read ( C2 )
90
50
25
100
T6
Read ( C3 )
Sum=Sum+C2
90
50
25
150
Т7
C3=C3+10
90
50
25
150
Т8
Write ( C3 )
90
50
35
150
Т9
Commit
Read ( C3 )
90
50
35
150
Т10
Sum=Sum+C3
90
50
35
185
Т11
Commit
90
50
35
185