Выбрать главу

При успешном завершении выполнения транзакции соответствующая таблица не изменяется немедленно, хотя соответствующие сообщения вывода создают именно такое впечатление. Для успешно завершившихся транзакций предусмотрены команды управления транзакциями, позволяющие либо сохранить в базе данных все предлагаемые транзакцией изменения, либо отменить их.

Управление транзакциями осуществляется с помощью следующих трех команд:

• COMMIT

• ROLLBACK

• SAVEPOINT Все они подробно обсуждаются в следующих разделах.

Команды управления транзакциями используются только с командами DML INSERT, UPDATE и DELETE. Например, оператор COMMIT не используется для подтверждения создания таблицы. При создании таблицы операция ее создания подтверждается автоматически. Точно так же нельзя с помощью команды ROLLBACK вернуть таблицу, только что удаленную из базы данных.

После завершения транзакции соответствующая ей информация сохраняется в специальном разделе (области) базы данных, предназначенной для хранения временных данных. Все соответствующие изменения будут сохраняться в этой области, пока к ним не будет применена соответствующая команда управления транзакциями. В результате применения такой команды соответствующие изменения либо вносятся в базу данных, либо отменяются, после чего область для хранения временных данных освобождается. Рис. 6.1 иллюстрирует процесс внесения изменений в реляционную базу данных.

Команда COMMIT

Команда COMMIT используется для передачи базе данных (сохранения) изменений, инспирированных транзакцией. Команда COMMIT сохраняет все транзакции, выполненные с момента предыдущего применения либо команды COMMIT, либо команды ROLLBACK.

Рис. 6.1. Область изменений, допускающих отмену Синтаксис команды следующий.

COMMIT [ WORK ];

Здесь обязательным является только ключевое слово COMMIT вместе с зависящим от реализации символом или командой, означающей завершение оператора. Ключевое слово WORK абсолютно необязательно - его единственной целью является придание команде более понятного вида.

Начнем с выбора всех данных из таблицы PRODUCTS_TMP.

SELECT * FROM PRODUCTS_TMP;

PROD_ID PROD_DESC COST

11235 КОСТЮМ ВЕДЬМЫ 29.99

222 ПЛАСТИКОВЫЕ ТЫКВЫ 7.75

13 ИСКУССТВЕННЫЕ ПАРАФИНОВЫЕ ЗУБЫ 1.1

90 ФОНАРИ 14.5

15 КОСТЮМЫ В АССОРТИМЕНТЕ 10

9 СЛАДКАЯ КУКУРУЗА 1.35

6 ТЫКВЕННЫЕ КОНФЕТЫ 1.45

87 ПЛАСТИКОВЫЕ ПАУКИ 1.05

119 МАСКИ В АССОРТИМЕНТЕ 4.95

1234 ЦЕПОЧКА ДЛЯ КЛЮЧЕЙ 5.95

2345 ПОЛОЧКА ИЗ ДУБА 59.99

11 строк выбраны. Затем удалим из таблицы все записи для товаров, стоимость которых меньше $14,00.

DELETE FROM PRODUCTSJTMP

WHERE COST < 14;

8 строк удалено.

Для того чтобы передать базе данных изменения, проведенные транзакцией, применяется оператор COMMIT:

COMMIT;

Передача выполнена.

При внесении в базу данных большого количества изменений настоятельно рекомендуется использовать команду COMMIT как можно чаще. Хотя слишком частое применение команды COMMIT приводит к существенному замедлению выполнения запрашиваемых операций. Не забывайте о том, что все изменения сначала размещаются в области, допускающей отмену изменений. Если эта область переполнится и не сможет принять очередную порцию информации о вносимых изменениях, база данных скорее всего совсем перестанет отвечать на запросы, что сделает дальнейшее осуществление транзакций вообще невозможным.

В некоторых реализациях SQL транзакции подтверждаются без явного использования команды COMMIT. В таких реализациях сам выход из базы данных автоматически вызывает подтверждение транзакций.

Команда ROLLBACK

Команда ROLLBACK используется для отмены транзакций, которые еще не были сохранены в базе данных. Команду ROLLBACK можно использовать для отмены только тех транзакций, которые были выполнены после применения последней из команд COMMIT или ROLLBACK.

Синтаксис команды ROLLBACK следующий.

rollback [ work ] ;

Как и в операторе COMMIT, ключевое слово WORK здесь тоже является необязательным.

В следующем примере сначала выберем все записи из таблицы PRODUCTS_TMP, оставшиеся в ней после удаления 8 записей.

SELECT * FROM PRODUCTS_TMP;

PROD_ID PROD_DESC COST

11235 КОСТЮМ ВЕДЬМЫ 29.99

90 ФОНАРИ 14.5

2345 ПОЛОЧКА ИЗ ДУБА 59.99

3 строки выбраны.

Затем изменим таблицу, приписав стоимость $39.99 товару с кодом 11235.

UPDATE PRODUCTS_TMP

SET COST = 39.99 WHERE PROD_ID = "11235';

1 строка обновлена.

Запрос к таблице покажет, что изменения как будто бы внесены. SELECT * FROM PRODUCTS_TMP;

PROD_ID PROD_DESC COST

11235 КОСТЮМ ВЕДЬМЫ 39.99

90 ФОНАРИ 14.5

2345 ПОЛОЧКА ИЗ ДУБА 59.99

3 строки выбраны. Теперь используем команду ROLLBACK, чтобы отменить последние изменения.

ROLLBACK;

Отмена выполнена.

Наконец, проверим, что изменения не были переданы базе данных.

SELECT * FROM PRODUCTS_TMP;

PROD_ID PROD_DESC COST

11235 КОСТЮМ ВЕДЬМЫ 29.99

90 ФОНАРИ 14.5

2345 ПОЛОЧКА ИЗ ДУБА 59.99

3 строки выбраны.

Команда SAVE POINT

Команда SAVEPOINT определяет точку в транзакции, к которой можно будет возвратиться, чтобы не отменять всю транзакцию. Синтаксис команды SAVEPOINT следующий.

SAVEPOINT ИМЯ_ТОЧКИ_ОТКАТА;

Эта команда предназначена только для создания точек отката между операторами транзакций. Для отмены групп транзакций используется команда ROLLBACK. Команда SAVEPOINT позволяет упростить процесс управления транзакциями путем разделения больших групп транзакций на более мелкие и лучше управляемые группы.

Имя точки отката должно быть уникальным внутри соответствующей группы транзакций. Однако имя точки отката может совпадать с именем таблицы или другого объекта. По поводу информации об ограничениях на задаваемые имена обратитесь к документации по используемой вами реализации SQL

Команда ROLLBACK TO SAVEPOINT

Команда возврата к точке отката имеет следующий синтаксис.

ROLLBACK TO ИМЯ_ТОЧКИ_ОТКАТА;

В следующем примере мы сначала удалим оставшиеся три. записи из таблицы, но перед каждым удалением создадим по точке отката, чтобы иметь возможность вернуться к любой из них и вернуть соответствующие данные в их прежнее состояние. SAVEPOINT SPl;

Точка отката создана.

DELETE FROM PRODUCTSJTMP WHERE PROD.ZD - '11235';

1 строка удалена.

SAVEPOINT SP2;

Точка отката создана.

DELETE FROM PRODUCTS_TMP WHERE PROD_ID - '90';

1 строка удалена.

SAVEPOINT SP3;

Точка отката создана.

DELETE FROM PRODUCTSJTMP WHERE PROD_ID - '2345';

1 строка удалена.

Теперь после выполнения всех удалений вы имеете возможность передумать и вернуться, например, к точке отката, которую вы назвали SP2. Поскольку SP2 была создана после выполнения первого удаления, возврат к ней означает отмену двух последних удалений.

ROLLBACK SP2;

Отмена выполнена.

При откате к точке SP2 оказывается выполненным только первое удаление. SELECT * FROM PRODUCTS_TMP;

PROD_ID PROD_DESC COST

90 ФОНАРИ 14.5 2345 ПОЛОЧКА ИЗ ДУБА 59.99

2 строки выбраны.

Помните, что сама по себе команда ROLLBACK возвращает к состоянию, сложившемуся после применения последнего из операторов COMMIT или ROLLBACK. В нашем случае операторы COMMIT не применялись, поэтому будут отменены все удаления:

ROLLBACK;

Отмена выполнена.

SELECT * FROM PRODUCTS_TMP;

PPOD_ID PROD_DESC COST

11235 КОСТЮМ ВЕДЬМЫ 29.99

90 ФОНАРИ 14.5

2345 ПОЛОЧКА ИЗ ДУБА 59.99

3 строки выбраны.

Команда RELEASE SAVEPOINT