Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_BD_2013-1.doc
Скачиваний:
139
Добавлен:
28.03.2015
Размер:
954.88 Кб
Скачать

52.Аномалии параллельных транзакций: потерянное обновление, зависимость от нефиксированных результатов, несогласованная обработка.

Управление параллельностью – это процесс организации одновременного выполнения в БД различных операций, гарантирующий исключение их взаимного влияния друг на друга.

Почему необходимо управлять параллельностью?

Важнейшей целью организации БД является обеспечение параллельного доступа нескольких пользователей к общим данным. Такой доступ осуществляется достаточно просто, если все пользователи читают данные, но как только один из параллельно обратившихся пользователей начинает изменять информацию возникает взаимное влияние процессов друг на друга. Обеспечивать же совместный доступ необходимо, так как это повышает общую производительность системы.

Существует три основных проблемы, которые могут иметь место при параллельном выполнении транзакций.

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

время

T1

T2

значение элемента f

t1

begin tran

100

t2

begin tran

read f

100

t3

read f

f:=f+100

100

t4

f:=f-10

write f

200

t5

write f

commit

90

t6

Commit

90

В данном случае элемент – значение поля некоторого кортежа.

Транзакции Т1 и Т2 начинаются практически одновременно и считывают одинаковое значение элемента f. Одна добавляет к значению элемента 100 и записывает результат, а вторая вычитает 10 и также записывает результат. Таким образом значение элемента равно 90. Если бы транзакции выполнялись последовательно, то значение поля было бы равно 190. То есть явное влияние транзакций друг на друга. Избежать такой проблемы можно, если запретить Т1 читать элемент f до тех пор, пока Т2 не запишет его значения.

2 Проблема зависимости от нефиксированных результатов. Проблема возникает, если одна транзакция получит доступ к промежуточным результатам выполнения другой транзакции до того, как они будут зафиксированы в БД.

время

Т1

Т2

значение элемента f

t1

begin tran

100

t2

read f

100

t3

f:=f+100

100

t4

begin tran

write f

200

t5

read f

... {т.е Т1 читает после записи Т2}

200

t6

f:=f-10

rollback

100

t7

write f

190

t8

commit

190

Если бы транзакции выполнялись бы последовательно, то значение элемента f было бы равно 90. Подобную проблему можно устранить, если запретить Т1 читать значение элемента f до того, как Т2 будет зафиксирована или отменена.

Проблема несогласованной обработки (неповторяемого чтения). Эта проблема возникает, когда одна транзакция только считывает элементы, но вторая в это время изменяет их значения. (T1переводит деньги с f1 на f3, а Т2 считает общую сумму на счетах f1, f2, f3)

время

Т1

Т2

f1

f2

f3

sum

t1

begin tran

100

50

25

t2

begin tran

sum:=0

100

50

25

0

t3

read f1

read f1

100

50

25

0

t4

f1:=f1-10

sum:=sum+f1

100

50

25

100

t5

write f1

read f2

90 /*уТ1 100*/

50

25

100

t6

read f3

sum:=sum+f2

90

50

25

150

t7

f3:=f3+10

90

50

25

150

t8

write f3

90

50

35

150

t9

commit

read f3

90

50

35

150

t10

sum:=sum+f3

90

50

35

185

t11

Commit

90

50

35

185

Таким образом, сумма получилась не верной, не смотря на то, что перевод осуществлялся между теми же счетами, по которым считалась сумма. В данном случае БД осталась в корректном состоянии, но пользователь получил некорректные данные.

Избежать этой проблемы можно запретив чтение данных, пока их не запишет другая транзакция, даже если первая из них – транзакция, только читающая данные.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]