Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция_14.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
202.75 Кб
Скачать

Свойства транзакций

Каждая транзакция БД должна обладать четырьмя основными свойствами:

  • Атомарность (Atomicity). Это свойство означает, что любая транзакция должна быть либо выполнена целиком, либо не выполнена совсем. Т.е выполняется все или ничего.

  • Согласованность (Consistency). Каждая транзакция должна переводить базу данных из одного согласованного состояния в другое согласованное состояние. Все строки, обрабатываемые SQL -оператором транзакции, должны быть защищены от изменений на время всей транзакции.

  • Изолированность (Isolation). Все транзакции должны отделяться друг от друга по завершенности. Результаты незавершенной транзакции не должны быть доступны другим транзакциям.

  • Долговечность или устойчивость (Durability). Результат выполнения завершенной транзакции не должен быть утрачен ни при каких условиях, т.е. он должен быть окончательно зафиксирован. Незавершенную транзакцию нужно отменить.

На английском языке для названия этих четырех свойств используется аббревиатура ACID.

Смысл: правильным образом реализованные транзакции должны удовлетворять “условиям ACID”. Сходная аббревиатура (АСИД) и на русском языке, что случается редко.

Транзакции в многопользовательском режиме

Для многопользовательских БД характерна параллельная обработка данных, т.е. параллельное (одновременное) выполнение нескольких транзакций.

Чтобы повысить производительность, разным пользователям (программам, процедурам) предоставляется одновременный доступ к таблицам, записям, полям и другим объектам. При этом операционная система переключает процессор между несколькими транзакциями. Но необходимо принимать специальные меры, чтобы действия одного пользователя не оказывали непредусмотренного влияния на действия других пользователей с данными.

Рассмотрим пример параллельного выполнения двух транзакций (ТА и ТБ):

ТА: UPDATE счета

SET баланс = баланс +2000

WHERE номер_счета = 820;

ТБ: UPDATE счета

SET баланс = баланс +1000

WHERE номер_счета = 820;

Пусть исходный баланс счета составляет 5000 единиц. Результатом выполнения этих двух транзакций должно быть увеличение баланса счета № 820 на 3000 единиц. Выполнение команды UPDATE состоит из трех операций:

  1. извлекается необходимая запись из внешней памяти (ВП) в оперативную память (ОП);

  2. изменяется значение счета в ОП;

  3. измененная запись записывается во ВП.

Но при параллельном выполнении этих двух транзакций на сервере БД может произойти следующая ситуация

Транзакция А (ТА) Транзакция Б (ТБ)

  1. Считать запись счета 820 в ОП.

  2. Увеличить значение счета на 2000.

  3. Записать измененную строку на диск

  1. Считать запись счета 820 в ОП.

  1. 2. Увеличить значение счета на 1000.

  2. 3. Записать измененную строку на диск

Порядок обработки на сервере БД

  1. Считать запись счета 820 в ОП (ТА).

  2. Считать запись счета 820 в ОП (ТБ).

  3. Увеличить значение счета на 2000 (ТА). Значение счета в ОП 5000+2000=7000

  4. Увеличить значение счета на 1000 (ТБ). Значение счета для ТБ 5000+1000=6000

  5. ТА переносит запись на диск с балансом 7000.

  6. ТБ переносит запись на диск с балансом 6000.

Итоговое значение баланса составит 6000 вместо 8000. Возникшая ситуация ошибки носит название проблемы потерянного обновления (lost update problem).

Главным способом исключения проблем возникновения ошибок (аномалий) при параллельной обработке является применение различных механизмов блокировок данных.