Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Свойства транзакций ⇐ ПредыдущаяСтр 7 из 7
Транзакция обладает 4 свойствами: атомарность, согласованность, изоляция и долговечность (АСИД) Согласованность. Транзакция защищают БД согласованно, т.е. переводят одно согласованное состояние в другое без обязательной поддержки согласованности во всех промежуточных точках. Изоляция. Транзакции отделены одна от другой. Т.е. любое обновление одной транзакции будет скрыто от остальных до тех пор, пока эта транзакция выполняется. Пусть имеем Т1 и Т2. Тогда справедливо утверждение: Т1 сможет увидеть обновление Т2 только после выполнения Т2, а Т2 сможет увидеть обновление Т1 только после выполнения Т1. Долговечность. Когда транзакция выполняется, её обновления сохраняются, даже если в следующий момент происходит сбой системы.
Восстановление системы
Система должна быть готова к восстановлению не только после небольших (например, невыполнение операций какой-либо транзакции), но и после глобальных нарушений типа сбоев в питании ЦПУ. Глобальные нарушения поражают сразу все транзакции. Существуют два вида глобальных нарушений. · отказ системы (например, сбои в питании). Их называют аварийным отказом программного обеспечения. Рис.3.3. Этапы выполнения транзакций. Транзакция Т1 – полностью сохраняется; Т2, Т4 – перезапускаются; Т3 и Т5 – отменяются.
3.2. Параллелизм операций над БД
Термин параллелизм означает возможность одновременной обработки в СУБД многих транзакций с доступом к одним и тем же данным, причём в одно и то же время. В такой системе для корректной обработки параллельных транзакций без возникновения конфликтных ситуаций необходимо использовать некоторый метод управления параллелизмом. Другим примером может служить статистическая база данных переписи населения. К такой базе данных одновременно может обращаться много пользователей. Поскольку здесь никто не изменяет данные, нет нужды беспокоиться о том, в каком порядке их читают процессы. Здесь можно позволить одновременное чтение данных по запросам. В данном случае, когда осуществляется лишь чтение, для экономии времени желательно в максимальной степени использовать параллелизм операций. В системе же продажи билетов, где выполняется как чтение, так и запись, необходимо наложить некоторые ограничения, если допускается одновременное использование двух программ. Существуют различные модели параллельных процессов применительно к операциям над базой данных. Эти модели различаются, в основном, степенью подробности описания доступа к её элементам. Как правило, чем в большей степени детализировать модель, тем большей параллелизм можно надёжно обеспечить.
3.3. Проблемы параллельных процессов
При обработке правильно составленных транзакций возникают ситуации, которые могут привести к получению неправильного результата из-за взаимных помех среди некоторых транзакций. Это следующие проблемы: 1 – проблема потери результатов обновления, 3 - чтение «грязных» данных,
Рис.3.4. Потеря результатов обновления. А – элемент БД; Т1, Т2 – транзакции; t-время Транзакция Т1 извлекает кортеж А в t1; Транзакция Т2 извлекает кортеж А в t2;
Пример 3.1. Пусть имеем две транзакции Т1 и Т2, обе эти транзакции представляют собой прогон программы Р. P: А =5; READ A; A=A+1; WRITE A; Выполнение программы представлено на рис.3.5. Рис.3.5. Выполнение программы Р. Легко заметить (см.рис.3.5.), что хотя каждая транзакция добавляла к А единицу, его значение возросло лишь на 1. Это представляет серьёзную проблему, если, например А – число мест, проданных на определённый авиарейс.
2). Незафиксированная зависимость.
Рис.3.6. Незафиксированная зависимость
Транзакция Т1 выполняется на основе фальшивого предположения, что кортеж А имеет некоторое значение в момент времени t2, тогда как на самом деле он имеет некоторое значение, существовавшее ещё в момент времени t1. В итоге после выполнения Т1 будет получен неверный результат. Надо иметь ввиду, что отмена выполнения Т2 может произойти не по вине Т2, а, например, в результате краха системы.
3). Чтение «грязных» данных (фиктивные элементы - фантомы): Рис.3.7. Чтение «грязных» данных
В промежутке между транзакциями была вставлена запись. При этом над частью данными были произведены действия. Транзакция Т1 дважды выполняет выборку строк с одним и тем же условием. Между выборками вклинивается транзакция Т2, которая добавляет строку, удовлетворяющую условию отбора α. Т1 ничего не знает о существовании Т2, и так как сама она ничего не меняет в базе данных, то ожидает, что после повторного отбора будут отобраны те же самые строки. Результат: Транзакция Т1 в двух одинаковых выборках строк получит разные результаты.
4). Проблема несовместимого анализа Транзакция Т1 выполняет анализ по всей таблице, например, подсчитывает общую сумму денег на счетах клиентов банка для главного бухгалтера. Пусть на всех счетах находятся одинаковые суммы, например, по 1000у.е. Пусть имеются три счёта S1, S2, S3 и везде по 1000у.е.. Транзакция Т2 в этот момент выполняет перевод 500у.е. c счёта S3 на S1. Общая сумма по всем счетам не меняется.
Рис.3.8. Несовместимый анализ Т1 – подводит баланс. Т2 – переводит суммы с одного счета на другой.
Конфликт транзакций
Анализ проблемы параллелизма показывает, что если не предпринимать специальных мер, то при совместной работе нарушается свойство (И) транзакций - изолированность. Транзакции реально мешают друг другу получать правильные результаты, если они пересекаются и обращаются к одним и тем же данным. В результате конкуренции за данными возникают конфликты доступа к данным. Различают конфликты:
Графики запуска транзакций могут быть: 1. Последовательные – если транзакции выполняются строго по очереди. Замечание: 1. «Притормаживать» некоторые транзакции (таким образом обеспечить, чтобы конкурирующие транзакции выполнялись в разное время). 2. Предоставить конкурирующим транзакциям «разные» экземпляры данных 1-ый реализуется путём использования блокировок 2-ой реализуется путём использования данных из журнала транзакций.
3.4. Элементы блокировки.
База данных может быть разбита на элементы, то есть на части, которые можно блокировать. Блокируя некоторый элемент, транзакция может препятствовать доступу других транзакций к этому элементу до тех пор, пока они не разблокируют его. P: LOCK A; READ A; A: =A+1; WRITE A; UNLOCK A; Пусть Т1 и Т2 - две исполнимых программы Р. При выполнении Т1 произойдёт блокировка. Если Т2 начинается до завершения Т1, то система заставит её ждать A: =A+1 Т1 |----------------------| Т2 - - - - - - - - |--------------------| Совместным результатом окажется увеличение А на 2.
Пусть существует механизм блокировки. В примере 2 блокировка предоставляется Т2 после снятия её транзакцией Т1. Рассмотрим теперь иную ситуацию. Пусть во время пребывания Т2 в состоянии ожидания транзакция Т3 только запрашивает блокировку А, и этот запрос выполняется раньше, чем запрос Т2. Далее, в то время, когда блокировку установила транзакция Т3, её запрашивает Т4, чьё требование удовлетворяется после разблокирования А транзакцией Т3 и т.д. Очевидно, при этом не исключена возможность того, что Т2 будет бесконечно находиться в состоянии ожидания.
Т1: LOCK A; UNLOCK A; T2: – – – – – – – -– – – – – – – - - - - - - - - - Тогда как некоторые другие транзакции постоянно осуществляют блокировку А, хотя и существуют неограниченное число моментов, когда транзакция Т2 имеет шансы заблокировать А. Состояние такого рода называют бесконечным ожиданием. Подобная проблема потенциально может возникнуть в любой обстановке, предусматривающей параллельное исполнение процессов. Простой способ избежать бесконечного ожидания заключается в том, что система предоставления блокировок должна регулировать все неудовлетворённые немедленно запросы и предоставлять возможность блокировки элемента А после его разблокирования первый запросившей её транзакции из числа ожидающих. Эта стратегия (" первым вошёл - первым обслуживается") устраняет бесконечные ожидания. Более серьёзная проблема, которая возникает при параллельной обработке - это так называемые «тупики». Пример 3.3. Пусть имеются две транзакции Т1 и Т2, основными действиями, которых при параллельной обработке являются следующие: Т1: lock A; lock B; unlock A; unlock B; T2: lock B; lock A; unlock B; unlock A; Здесь не имеет значения, что конкретно делают с элементами А и В эти транзакции. Пусть они начинают использоваться примерно в одно и то же время. Транзакция Т1 запрашивает блокировку А и её запрос удовлетворяется. Точно так же удовлетворяется запрос транзакции Т2 на блокировку В затем Т1 запрашивает блокировку В и вынуждает ждать, поскольку этот элемент заблокирован транзакцией Т2. Аналогично Т2 запрашивает блокировку А и должна ждать, пока Т1 разблокирует А. Таким образом ни одна транзакция не может продолжаться. Каждая из них ожидает пока другая разблокирует требуемый для неё элемент. Поэтому Т1 и Т2 будут ждать бесконечно.
Способы предотвращения тупиков
1). Потребовать, чтобы каждая транзакция единовременно запрашивала все нужные ей блокировки. В нашем примере система предоставила бы блокировку как А, так и В для транзакции Т1, если бы она запросила блокировку первой. После завершения Т1 обе эти блокировки могли бы быть установлены для Т2, то есть Т2 должна ждать. Пусть в нашем примере А предшествует В, тогда затребовав блокировку А перед В, Т2 обнаруживает, что А уже заблокирована Т1. Элемент В не был ещё заблокирован для Т2. поэтому для Т1 доступна блокировка В, когда она будет запрашиваться. При завершении Т1 блокировки на А и В снимаются и Т2 может продолжаться.
3.5. Расписание транзакций Последовательное исполнение транзакции при использовании блокировок элементов замедляет процесс работы с БД, хотя и работает правильно. Т1: LOCK A; UNLOCK A; ---------------------------------------------------------T2: LOCK A; UNLOCK A; Будем называть расписанием для транзакций порядок, в котором выполняются элементарные шаги этих транзакций (блокировка, чтение и т.д.). Последовательность элементарных шагов, выполняемых транзакцией, называется расписанием. Расписание считается последовательным, если все шаги каждой транзакции выполняются последовательно, и сериализуемым, если его результат эквивалентен результату некоего последовательного расписания. Пример 3.4. Рассмотрим, например, следующие две транзакции, которые могут быть частью бухгалтерской операции по переводу денежных средств с одного счёта на другой. Т1: READ A; A: =A-10; WRITE A; READ B; B: =B+10; WRITE B; T2: READ B; B: =B-20; WRITE B; READ C; C: =C+20; WRITE C; Понятно, что любое последовательное расписание обладает свойством постоянства суммы A+B+C. Пример расписания: А+В+С Последовательное: Т1 Т2 READ B B=B-20 WRITE B READ C C=C+20 WRITE C Т1 Т2 Рис.3.9. Расписания транзакций Отметим, что в последнем случае величина B увеличивается, а не уменьшается на 10 в силу того, что Т1 читает В прежде, чем Т2 записывает новые уменьшенные значения В. Предотвратить это сложно. В случае, когда допускаются произвольные операции с элементами невозможно проверить, дают ли два расписания одинаковый результат при всех начальных значениях элементов. На практике делаются некоторые упрощающие предположения относительно операций, выполняемых над элементами. Удобно предположить, в частности, что одинаковые их значения можно получить только при одной и той же последовательности операций. Поэтому нельзя считать, что (А+10)-20 и (А+20)-30 продуцируют одни и те же значения. Игнорируя алгебраические свойства арифметики, мы совершаем лишь «нефатальные» ошибки. Но зато расписание никогда не рассматривается как сериализуемое, если оно не является таким («фатальная» ошибка).
Протоколы и расписания
Как было показано выше, произвольные транзакции при их параллельном исполнении могут приводить к бесконечному ожиданию, тупиковым ситуациям и несериализуемому расписанию. Для исключения подобных ситуаций имеются два инструмента. · 2-й подход – использование протоколов. Протокол представляет собой введение ограничений на последовательность шагов, которые может выполнять транзакция. Например, протоколом является исключающая тупики стратегия запрашивания блокировок элементов в некотором фиксированном порядке.
|