|
Программирование >> Sql: полное руководство
Как правило, изменения в базе данных обусловлены событиями, происходящими во внещнем мире , такими, например, как прием нового заказа от клиента. При этом подобное событие приводит не к одному, а к четырем изменениям в учебной базе данных; добавление нового заказа в таблицу orders; обновление фактического объема продаж для служащего, принявшего заказ; обновление фактического объема продаж для офиса, в котором работает данный служащий; обновление количества товара, имеющегося в наличии. Чтобы в базе данных не возникли противоречия, четыре указанных изменения следует выполнить как одно целое. Если из-за системного сбоя или другой ошибки получится, что одна часть изменений была внесена, а другая - нет, то это нарушит целостность хранимых данных. При последующих вычислениях результаты окажутся неверными. Поэтому несколько изменений базы данных, которые вызваны одним событием, необходимо вносить по принципу либо все, либо ничего . Это обеспечивается средствами обработки транзакций, имеющимися в SQL и описанными в настоящей главе. Что такое транзакция Транзакцией называются несколько последовательных инструкций SQL, которые рассматриваются как единое целое. Инструкции, входящие в транзакцию, выполняют взаимосвязанные действия. Каждая инструкция решает часть общей задачи, но для того, чтобы задачу можно было считать решенной, требуется вьшолнить все эти инструкции. Ниже приведен ряд типичных примеров транзакций для учебной базы данных, а также описаны инструкции, входящие в эти транзакции. Прием заказа. Для приема заказа от клиента профамма ввода заказов должна: (а) вьшолнить запрос к таблице products и проверить наличие товара на складе; (б) добавить заказ в таблицу orders; (в) обновить таблицу products, вычтя заказанное количество товара из количества товара, имеющегося в наличии; (г) обновить таблицу salesreps, добавив стоимость заказа к объему продаж служащего, принявшего заказ; и (д) обновить таблицу offices, добавив стоимость заказа к объему продаж офиса, в котором работает данный служащий. Отмена заказа. Чтобы отменить заказ, принятый от клиента ранее, профамма должна: (а) удалить заказ из таблицы orders; (б) обновить таблицу products, откорректировав количество товара, имеющегося в наличии; (в) обновить таблицу salesreps, вычтя стоимость заказа из объема продаж служащего; и (г) обновить таблицу offices, вычтя стоимость заказа из объема продаж офиса. Перевод клиента. При переводе клиента от одного служащего к другому профамма должна: (а) соответствующим образом обновить таблицу customers; (б) обновить таблицу orders, изменив имя служащего, ответственного за заказы данного клиента; (в) обновить таблицу salesreps, уменьшив план для служащего, теряющего клиента; и (г) обновить таблицу salesreps, увеличив план служащего, приобретающего клиента. Во всех указанных случаях для обработки одной логической транзакции требуется выполнить последовательность из четырех или пяти действий, каждое из которых представлено отдельной инструкцией SQL. Понятие транзакции является очень важным для программ, изменяющих содержимое базы данных, так как позволяет обеспечить ее целостность. Транзакции в реляционной СУБД подчиняются следующему правилу: Инструкции, входящие в транзакцию, рассматриваются как неделимое целое Либо все инструкции будут выполнены успешно, либо ни одна из них не должна быть выполнена . Как следует из рис. 12.1, СУБД должна подчиняться этому правилу, даже если во время выполнения транзакции произойдет ошибка в профамме или аппаратный сбой. В любом случае СУБД должна гарантировать, что при восстановлении базьг данных после сбоя частичное выполнение транзакции в ней офажено не будет. Состояние базы данных -* перед транзакцией Транзакция Состояние базы данных- после транзакции select update update delete insert Рис. 12.1. Понятие транзакции в SQL select update update delete \ /ошибка Л \ V в программе!/
СУБД отменяет все изменения СУБД отменяет все изменения Инструкции COMMIT и ROLLBACK в SQL обработка фанзакции реализована с помощью двух инсфукций, изображенных на рис. 12.2. Инструкция COMMIT сообщает об успешном окончании транзакции. Она информирует СУБД о том, что транзакция завершена, все инструкции, входящие в состав транзакции, выполнены успешно и противоречия в базе данных не возникли. Инструкция rollback сообщает о неуспещном окончании транзакции. Она информирует СУБД о том, что пользователь не хочет завершать транзакцию; СУБД должна отменить все изменения, внесенные в базу данных в результате выполнения транзакции. Т.е. СУБД возвращает базу данных в состояние, в котором она находилась до начала транзакции.
Инструкции commit и rollback являются такими же инструкциями SQL, как и select, insert ИЛИ update. Ниже приведен пример успешной транзакции, изменяющей количество заказанного товара и стоимость заказа, а также корректирующей количество товара, имеющегося в наличии, вместе с объемами продаж служащего и офиса. Обычно такие изменения обрабатывает специальная профамма, содержащая соответствующие формы и использующая для выполнения инструкций профзммный SQL: В заказе с номером 113051 изменить количество товара с 4 на 10, что увеличивает стоимость заказа с $1458 до $3550. Это заказ на изделие QSA-XK47, который был принят Ларри Фитчем (идентификатор служащего 108), работающим в Лос-Анджелесе (идентификатор офиса 21). UPDATE ORDERS SET QTY = 10, AMOUNT = 3550.00 WHERE ORDER NUM = 1130 51 UPDATE SALESREPS SET SALES = SALES - 1458.00 + 3550.00 WHERE EMPL NUM =108 UPDATE OFFICES SET SALES = SALES - 1458.00 + 3550.00 WHERE OFFICE =21 UPDATE PRODUCTS SET QTy ON HAND = QTY ON HAND +4-10 WHERE MFR ID = QSA А5ГО PRODUCT ID = XK4T ... окончательное подтверждение вносимых изменений клиентом ... COMMIT WORK Теперь предположим, что в этой транзакции пользователь делает ошибку при вводе идентификатора товара. Для исправления ошибки производится отмена и повторный ввод фанзакции:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |