|
Лекции и практики (1). Курс лекций и материалы для практических занятий
Взаимовлияние транзакций Транзакции в многопользовательской БД должны быть изолированы друг от друга, т.е. в идеале каждая из них должна выполняться так, как будто выпол- няется только она одна. В реальности транзакции выполняются одновременно и могут влиять на результаты друг друга, если они обращаются к одному и тому же набору данных и хотя бы одна из транзакций изменяет данные.
В общем случае взаимовлияние транзакций может проявляться в виде:
потери изменений; чернового чтения; неповторяемого чтения; фантомов.
Потеря изменений могла бы произойти при одновременном обновлении двумя и более транзакциями одного и того же набора данных. Транзакция, за- кончившаяся последней, перезаписала бы результаты изменений, внесённых предыдущими транзакциями, и они были бы потеряны.
Представим, что одновременно начали выполняться две транзакции: транзакция 1 – UPDATE СОТРУДНИКИ
SET Оклад= 39200
WHERE Номер= 1123;
транзакция 2 – UPDATE СОТРУДНИКИ
SET Должность= "старший экономист" WHERE Номер= 1123;
Обе транзакции считали одну и ту же запись (1123, "Рудин В.П.", "экономист", 28300) и внесли каждая свои изменения: в бухгалтерии изменили оклад (тран- закция 1), в отделе кадров – должность (транзакция 2). Результаты транзакции 1 будут потеряны (рис. 6.2).
1123
| Рудин В.П.
| экономист
| 28300
|
1123
| Рудин В.П.
| экономист
| 39200
|
1123
| Рудин В.П.
| старший экономист
| 28300
|
Рис. 6.2. Недопустимое взаимовлияние транзакций: потеря изменений
! СУБД не допускает такого взаимовлияния транзакций, при котором возможна потеря изменений. Ситуация чернового чтения возникает, когда транзакция считывает из-
менения, вносимые другой (незавершённой) транзакцией. Если эта вторая тран- закция не будет зафиксирована, то данные, полученные в результате чернового чтения, будут некорректными. Транзакции, осуществляющие черновое чтение, могут использоваться только при невысоких требованиях к согласованности данных: например, если транзакция считает статистические показатели, когда отклонения отдельных значений данных слабо влияют на общий результат.
При повторяемом чтении один и тот же запрос, повторно выполняемый одной транзакцией, возвращает один и тот же набор данных (т.е. игнорирует изменения, вносимые другими завершёнными и незавершёнными транзакция- ми). Неповторяемое чтение является противоположностью повторяемого, т.е. транзакция "видит" изменения, внесённые другими (завершёнными!) транзак- циями. Следствием этого может быть несогласованность результатов запроса, когда часть данных запроса соответствует состоянию БД до внесения измене- ний, а часть – состоянию БД после внесения и фиксации изменений.
Фантомы – это особый тип неповторяемого чтения. Возникновение фан- томов может происходить в ситуации, когда одна и та же транзакция сначала производит обновление набора данных, а затем считывание этого же набора. Если считывание данных начинается раньше, чем закончится их обновление, то в результате чтения можно получить несогласованный (не обновлённый или частично обновлённый) набор данных. При последующих запросах это явление пропадает, т.к. на самом деле запрошенные данные после завершения обновле- ния будут согласованными в соответствии со свойствами транзакции.
Для разграничения двух пишущих транзакций и предотвращения потери изменений СУБД используют механизмы блокировок или временных отметок, а для разграничения пишущей и читающих транзакций – специальные правила поведения транзакций, которые называются уровнями изоляции транзакций.
|
|
|