Транзакция – это логически завершенная последовательность действий над данными информационной системы, не нарушающая ограничения целостности.
• Логическая целостность означает, что удовлетворяются все ограничения, накладываемые на наборы данных моделью системы.
• Физическая целостность означает, что состояние файлов хранилища данных корректно, т. е. ни один из элементов хранилища не является испорченным с точки зрения СУБД. Транзакция:
1. последовательность операторов языка SQL, которая рассматривается как неделимое действие над БД
2. логическая единица работы системы, реализующая некоторую прикладную функцию.
Свойства транзакции:
1. Атомарность (Atomicity) – транзакция должна быть выполнена в целом или не выполнена вовсе.
2. Согласованность (Consistency) – транзакция не разрушает взаимной согласованности данных.
3. Изолированность (Isolation) конкурирующие за доступ к данным транзакции физически обрабатываются последовательно, изолированно друг от друга.
4. Долговечность (Durability) при успешном завершении транзакции произведенные ею изменения в данных не могут быть потеряны.
Откат и фиксация транзакций:
• Фиксация транзакции – это действие, обеспечивающее запись на диск изменений в базе данных, которые были сделаны в процессе выполнения транзакции.
• Откат транзакции – это действие, обеспечивающее аннулирование всех изменений данных.
• Откат и фиксация транзакций становятся возможными благодаря журналу транзакций.
Если данные хранятся в одной базе данных, то транзакция к ней рассматривается как локальная. Распределенные системы обычно включают несколько компьютеров - серверов баз данных, называемых узлами. Данные физически распределены между ними. На каждом узле содержится некоторая локальная база данных, содержащая фрагмент данных из общей распределенной базы. В распределенных базах транзакция, выполнение которой заключается в обновлении данных на нескольких узлах сети, называется глобальной или распределенной транзакцией.
Внешне выполнение распределенной транзакции выглядит как обработка транзакции к локальной базе данных. Тем не менее, распределенная транзакция включает в себя несколько локальных транзакций, каждая из которых завершается двумя путями - фиксируется или прерывается. Распределенная транзакция фиксируется только в том случае, когда зафиксированы все локальные транзакции, ее составляющие. Если хотя бы одна из локальных транзакций была прервана, то должна быть прервана и распределенная транзакция.
Для этого в современных СУБД предусмотрен так называемый протокол двухфазовой (или двухфазной) фиксации транзакций (two-phase commit). Название отражает тот факт, что фиксация распределенной транзакции выполняется в две фазы.
Фаза 1 начинается, когда при обработке транзакции встретился оператор COMMIT. Сервер распределенной БД (или компонент СУБД, отвечающий за обработку распределенных транзакций) направляет уведомление "подготовиться к фиксации" всем серверам локальных БД, выполняющим распределенную транзакцию. Если все серверы приготовились к фиксации (то есть, откликнулись на уведомление и отклик был получен), сервер распределенной БД принимает решение о фиксации. Серверы локальных БД остаются в состоянии готовности и ожидают от него команды "зафиксировать". Если хотя бы один из серверов не откликнулся на уведомление в силу каких-либо причин, будь то аппаратная или программная ошибка, то сервер распределенной БД откатывает локальные транзакции на всех узлах, включая даже те, которые подготовились к фиксации и оповестили его об этом.
Фаза 2 - сервер распределенной БД направляет команду "зафиксировать" всем узлам, затронутым транзакцией, и гарантирует, что транзакции на них будут зафиксированы. Если связь с локальной базой данных потеряна в интервал времени между моментом, когда сервер распределенной БД принимает решение о фиксации транзакции, и моментом, когда сервер локальной БД подчиняется его команде, то сервер распределенной БД продолжает попытки завершить транзакцию, пока связь не будет восстановлена.