**Транзакция (ТА)** - это такая неделимая с точки зрения воздействия на БД последовательность операторов работы с данными, что либо результаты всех операторов, входящих в ТА, отображаются в БД, либо их воздействие отсутствует. Лозунг ТА - все или ничего. При завершении операций оператором **commit** результаты фиксируются во внешней памяти. Если оператором **rollback** - все отменяется. ТА обеспечивают целостность БД и изолированность пользователей. ## Целостность БД Иногда целостность нельзя не нарушить, поэтому состояние нецелостности допускается внутри транзакций. Различают 2 вида ограничений целостности (ОЦ): 1. **Немедленно проверяемое ОЦ** - это ограничение, проверку которого бессмысленно или невозможно откладывать. Реализуется оператором высокого уровня. При этом не вся ТА отменяется, а лишь оператор. 2. **Откладываемое ОЦ** - это ограничение на БД, а не на операции. Проверяется в конце ТА. ## Изолированность пользователей ТА обеспечивают изолированность пользователей, т. е. создается иллюзия того, что каждый работает с БД в одиночку. ТА выступает единицей изолированности пользователя. Существуют 4 уровня изолированности: 1. **Отсутствие потерянных изменений** Т1 изменяет объект $A$ базы данных. До завершения Т1, Т2 также пытается изменить объект. Т2 завершается оператором **rollback**. Тогда при повторном чтении объекта $A$, Т1 не видит изменений объекта, произведенных ранее. Это противоречит требованию изолированности пользователей. Решение: до завершения Т1 никакая ТА не может изменять объект. Отсутствие потерянных изменений - это минимальное требование СУБД к параллельно выполняемым ТА. 2. **Отсутствие чтения "грязных" данных (проблема промежуточных данных)** Т1 изменяет объект $A$. Параллельно с этим Т2 читает. Т. к. операция изменения не завершена, Т2 видит несогласованные "грязные" данные. Несоответствие требованию изолированности: каждый пользователь начинает свою ТА при согласованном состоянии БД. Решение: до завершения ТА, изменившей объект, никакая ТА не должна читать этот объект. 3. **Отсутствие неповторяющихся чтений** Т1 читает объект $A$. До завершения Т1, Т2 изменяет объект и успешно завершается **commit**'ом. Т1 повторно читает объект и видит его измененное состояние. Неповторяющееся чтение. Решение: до завершения Т1 никакая другая ТА не должна изменять объект. 4. **Проблема кортежей-фантомов** Т1 выполняет оператор выборки кортежа отношения $R$ с условием выборки $S$. До завершения Т1, Т2 вставляет в $R$ новый кортеж, удовлетворяющий $S$ и успешно завершается. Т1 повторно выполняет этот оператор и в результате видит новый кортеж. Противоречие идее изолированности. Решение: требуется более высокий уровень синхронизации ТА ## Сериализация транзакций Чтобы добиться изолированности ТА, в СУБД есть методы регулирования совместного их выполнения. **Сериализация** - это механизм выполнения ТА по некоторому сериальному плану. Результат совместного выполнения ТА эквивалентен результату некоторого последовательного выполнения этих же ТА. Методы сериализации основываются на учете 3 конфликтов: WW, RW, WR. Методы сериализации: 1. Метод синхронизационных захватов (СЗ) объектов БД 2. Метод временных меток Перед выполнением операций над объектом БД, от имени ТА запрашивается СЗ объекта в каком то из режимов: - **Совместный режим** ($S$) - это разделяемый захват объекта, требуется для чтения - **Монопольный режим** ($X$) - для операций занесения данных, удаления, модификации Захваты объектов по R совместимы. Захват по R несовместим с захватом по W. Захваты по W несовместимы. Что считать объектом для захвата: - **Файл** - физический объект, где хранятся несколько отношений - **Отношение** - логический объект с множеством кортежей - **Кортеж** - элементарный физический объект БД - **Страница данных** - физический объект, который хранит кортежи одного или нескольких отношений и индексную, служебную информацию Операция над кортежем - это операция над страницей, где он находится, и над отношением, и над файлом. Чем крупнее объект СЗ, тем меньше этих СЗ будет поддерживаться, и на них будет меньше расходов. Но возрастает вероятность конфликтов между ТА. Сегодня реализованы покортежные захваты. Есть еще **гранулированные СЗ**. #### Тупики Выполнение СЗ приводит к тупикам между ТА: 1. Т1 и Т2 устанавливают монопольные захваты объектов $A1$ и $A2$ соответственно. 2. Т1 требует совместный захват $A2$, а Т2 - совместный захват $A1$ 3. Ни одна из ТА не продолжится. Монопольные захваты не будут сняты, а совместные не будут удовлетворены. Обнаруживают тупики через граф ожидания ТА. По этому графу обнаруживается цикл, где и выбирается ТА-жертва и ее откатывают.