Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопросы_тест_по_БД.doc
Скачиваний:
3
Добавлен:
18.09.2019
Размер:
208.38 Кб
Скачать
  1. Какая проблема возможна при параллельном выполнении транзакций

Выделяют три вида проблем, которые могут иметь место при параллельном выполнении транзакций.

  • Проблема потерянного обновления. Результаты успешно завершенной операции обновления одной транзакции могут быть перекрыты результатами выполнения другой транзакции. Рассмотрим пример, в котором параллельно выполняются две транзакции. Транзакция Т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