Обработка транзакций
Обработка транзакций обеспечивает сохранение целостности базы данных за счет того, что пакеты операций SQL выполняются полностью или не выполняются вовсе.
Как объяснялось в разделе, "Объединение таблиц", реляционные базы данных организованы таким образом, что информация в них хранится во многих таблицах. Благодаря этому облегчается манипулирование, управление данными, а также их повторное использование. Не вдаваясь в подробности, как и почему именно так устроены реляционные базы данных, следует заметить, что схемы всех хорошо спроектированных баз данных можно в какой-то степени отнести к реляционным.
Таблица Orders, которую мы использовали в последних 18-ти уроках, — хороший пример. Заказы хранятся в двух таблицах, в таблице Order Items хранится информация об отдельных предметах заказов. Эти две таблицы связаны (соотнесены) между собой с помощью уникального идентификатора, который называется первичный ключ (см. урок 1, "Что такое SQL")- Эти таблицы, кроме того, связаны и с другими таблицами, содержащими информацию о клиентах и продуктах.
1. Проверка, содержится ли информация о клиенте в базе данных. Если нет, такая информация добавляется.
2. Выборка идентификатора клиента.
3. Добавление строки в таблицу Orders, связывающую ее (строку) с идентификатором клиента.
4. Выборка идентификатора нового заказа, присвоенного ему в таблице Orders
5. Добавление одной строки в таблицу Order Items для каждого заказанного предмета, соотнесение его с таблицей Orders посредством выбранного идентификатора (и с таблицей Products посредством идентификатора продукта).
Теперь предположим, что какая-то ошибка в базе данных (например, нехватка места на диске, ограничения, связанные с безопасностью, блокировка таблицы) помешала завершить эту последовательность действий.
Что случится с данными?
Но что если ошибка произойдет после того, как была добавлена строка в таблицу Orders, но до того, как будут добавлены строки в таблицу Orderltems? Теперь в вашей базе данных будет присутствовать пустой заказ.
Еще хуже: что если система сделает ошибку в процессе добавления строк в таблицу Orderltems? В таком случае в вашу базу данных заказ будет внесен лишь частично, и вы даже не будете знать об этом.
Как можно решить эту проблему? Именно здесь в игру вступает транзактная организация обработки данных, которую мы ради краткости будем называть обработка транзакций. Обработка транзакций — это механизм, используемый для управления наборами операций SQL, которые должны быть выполнены в пакете, т.е. таким образом, чтобы в базу данных не могли попасть результаты частичного выполнения этого пакета операций. При обработке транзакций вы можете быть уверенными в том, что выполнение набора операций не было прервано на середине — они или были выполнены все, или не была выполнена ни одна из них (если только не было явно указано иное). Если ошибки не произошло, результаты работы всего набора операторов фиксируются (записываются) в таблицах базы данных. Если произошла ошибка, должна быть выполнена отмена (аннулирование) всех операций, чтобы возвратить базу данных в известное и безопасное состояние.
Итак, если вернуться к нашему примеру, то вот как должен на самом деле выполняться процесс.
1. Проверка, содержится ли информация о клиенте в базе данных. Если нет, такая информация добавляется.
2. Фиксация информации о клиенте.
3. Выборка идентификатора клиента.
4. Добавление строки в таблицу Orders.
5. Если во время добавления строки в таблицу Orders происходит ошибка, операция отменяется.
6. Выборка идентификатора нового заказа, присвоенного ему в таблице Orders
7. Добавление одной строки в таблицу Orderltems для каждого заказанного предмета.
8. Если в процессе добавления строк в таблицу Orderltems происходит ошибка, добавление всех строк в таблицу Orderltems отменяется.
• Фиксация (Commit). Запись несохраненных операторов SQL в таблицы базы данных.
• Точка сохранения (Savepoint). Временное состояние в ходе выполнения транзакции, в которое можно вернуться после отмены части операций пакета (в отличие от отмены всей транзакции). Иногда это состояние называют "точка отката".
Действие каких операторов можно отменить?


