1.8. Процедуры баз данных: транзакции, триггеры

Под хранимыми процедурами баз данных или просто процедурами баз данных будет понимать действия с БД, осуществляемые в соответствии с некоторыми сохраненными ранее последовательностями команд.
В частности, процедуры БД используются для поддержки механизма управления транзакциями. Под транзакцией понимается последовательность операций над БД, рассматриваемых СУБД как единое целое. Либо транзакция успешно выполняется, и СУБД фиксирует изменения БД, произведенные этой транзакцией, во внешней памяти, либо ни одно из этих изменений никак не отражается на состоянии БД. Понятие транзакции необходимо для поддержания логической целостности БД. Если вспомнить наш пример информационной системы в 1.6, то единственным способом не нарушить целостность БД при выполнении операции изменения зарплаты сотрудника является объединение элементарных операций над файлами, в которых хранятся таблицы, в одну транзакцию. Таким образом, поддержание механизма транзакций является обязательным условием даже однопользовательских СУБД (если, конечно, такая система заслуживает названия СУБД). Но понятие транзакции гораздо более важно в многопользовательских СУБД.
То свойство, что каждая транзакция начинается при целостном состоянии БД и оставляет это состояние целостным после своего завершения, делает очень удобным использование понятия транзакции как единицы активности пользователя по отношению к БД. С управлением транзакциями в многопользовательской СУБД связаны важные понятия сериализации транзакций и сериального плана выполнения смеси транзакций. Под сериализаций параллельно выполняющихся транзакций понимается такой порядок планирования их работы, при котором суммарный эффект смеси транзакций эквивалентен эффекту их некоторого последовательного выполнения. Серийный план выполнения смеси транзакций - это такой план, который приводит к сериализации транзакций. Понятно, что если удается добиться действительно серийного выполнения смеси транзакций, то для каждого пользователя, по инициативе которого образована транзакция, присутствие других транзакций будет незаметно (если не считать некоторого замедления работы по сравнению с однопользовательским режимом).
Существует несколько базовых алгоритмов сериализации транзакций. В централизованных СУБД наиболее распространены алгоритмы, основанные на синхронизационных захватах объектов БД. При использовании любого алгоритма сериализации возможны ситуации конфликтов между двумя или более транзакциями по доступу к объектам БД. В этом случае для поддержания сериализации необходимо выполнить откат (ликвидировать все изменения, произведенные в БД) одной или более транзакций. Это один из случаев, когда пользователь многопользовательской СУБД может реально (и достаточно неприятно) ощутить присутствие в системе транзакций других пользователей.
К процедурам БД относятся и триггеры, т. е. специальные последовательности операций над данными, выполняющиеся в определенных ситуациях. Принцип вызова триггеров напоминает принцип реакции на наступление событий в некоторых объектно-ориентированных средах программирования. Одним из примеров применения триггеров является поддержка целостности данных, как например в примере, приведенном в 1.6. Для синхронизации таблиц З/П СОТРУДНИКОВ (ФИО, подразделение, з/п) и СРЕДНЯЯ З/П ПО ПОДРАЗДЕЛЕНИЯМ (подразделение, средняя з/п) целесообразно обеспечить запуск триггера, пересчитывающе¬го среднюю з/п в ряде подразделений при каждом изменении таблицы З/П СОТРУДНИКОВ (и соответственно изменяющего данные в таблице СРЕДНЯЯ З/П ПО ПОДРАЗДЕЛЕНИЯМ. При этом возможность «ручного» изменения данных во второй таблице должна быть запрещена.