**Транзакция (ТА)** - это такая неделимая с точки зрения воздействия на БД последовательность операторов работы с данными, что либо результаты всех операторов, входящих в ТА, отображаются в БД, либо их воздействие отсутствует. Лозунг ТА - все или ничего.  
При завершении операций оператором **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. Ни одна из ТА не продолжится. Монопольные захваты не будут сняты, а совместные не будут удовлетворены.
  
Обнаруживают тупики через граф ожидания ТА. По этому графу обнаруживается цикл, где и выбирается ТА-жертва и ее откатывают.