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

зафиксирован (или отменен) в базе данных как единое целое.

Изменение содержимого таблиц 273

Примером транзакции может служить перевод денег с одного банковского

счета на другой. Один оператор UPDATE должен уменьшить количество

денег на одном банковском счете, а другой оператор UPDATE на ту же самую

сумму увеличить количество денег на другом банковском счете. Как вычитание,

так и добавление денег должны быть зафиксированы в базе данных

(с помощью оператора COMMIT) либо отменены (оператором ROLLBACK), так

как в противном случае деньги будут потеряны. В простейшем примере

используется всего два оператора UPDATE, но более реалистичные транзакции

могут состоять из большого числа операторов INSERT, UPDATE и DELETE.

Фиксирование и откат транзакций

Чтобы сделать постоянными результаты операторов SQL, из которых состоит

транзакция, нужно с помощью оператора COMMIT выполнить операцию

фиксации. Чтобы отменить результаты операторов SQL, необходимо

выполнить их откат с помощью оператора ROLLBACK, который возвращает

строки к их первоначальному виду.

В следующем примере в таблицу customers включается новая строка, а

затем эти изменения становятся постоянными с помощью оператора

COMMIT:

□ INSERT INTO customers

values(6, ‘Fred’, ‘Green’, ‘01-JAN-1970', ‘800-555-12-15’);

1 row created.

COMMIT;

Commit complete.

Следующий пример обновляет строку в таблице customers, а затем отменяет

эти изменения, выполнив оператор ROLLBACK:

□ UPDATE customers

SET firs t_ n am e = ‘ Edward’

WHERE customer_id = 1;

1 row updated.

ROLLBACK;

R o llb a c k complete.

Убедиться в том, что в таблице customers сделаны соответствующие изменения,

можно с помощью следующего запроса:

□ SELECT *

FROM customers;

CUST0MER_ID FIRST_NAME LAST_NAME DOB PHONE

1 John

2 Cynthia

Brown

Green

White

Black

Blue

Green

01-JAN-65 800-555-1211

0 5 -FEB-68 800-555-1212

16-3 Steve MAR—71 800-555-1213

4 G a il 800-555-1214

20-MAY-70

01-JAN-70 800-555-1215

5 Doreen

6 Fred

274 Глава 8

Результаты оператора INSERT, добавившего строку для покупателя № 6,

стали постоянными с помощью оператора COMMIT, а результаты оператора

UPDATE, изменившего имя покупателя № 1, были отменены с помощью оператора

ROLLBACK.

Начало и завершение транзакции

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

разделения на части деятельности базы данных. У транзакции имеется и

начало, и конец. Она начинается, когда происходит одно из следующих

событий:

■ Вы подключаетесь к базе данных и выполняете первый оператор

DML (INSERT, UPDATE или DELETE).

■ Закончилась предыдущая транзакция, и вы ввели следующий оператор

DML.

Транзакция считается законченной, если произошло одно из следующих

событий:

■ Вы выполнили операцию ROLLBACK или COMMIT.

■ Вы выполнили оператор DML, например, CREATE TABLE, в этом случае

оператор COMMIT выполняется автоматически.

■ Вы выполнили оператор DML, например, оператор GRANT, в этом случае

оператор COMMIT выполняется автоматически (об операторе GRANT

см. в следующей главе).

■ Вы отключаетесь от базы данных. Если вы выходите из SQIifPlus, как

обычно, используя для этого команду EXIT, для вас автоматически выполняется

команда COMMIT. Если же SQITPlus завершается аварийно,

например, если вышел из строя компьютер, на котором выполнялась

SQITPlus, автоматически выполняется команда ROLLBACK. Это применимо

для любой программы, обращающейся к базе данных. Например,

если вы написали H a ja v a программу, которая обращается к базе

данных, и она вышла из строя, для нее будет автоматически выполнен

оператор ROLLBACK.

■ Вы выполнили оператор DML, который завершился аварийно, по

причине чего был автоматически выполнен оператор ROLLBACK для

этого конкретного оператора DML.

Совет Считается дурным тоном не завершать транзакцию явным оператором фиксации

или отката, так что не забудьте удостовериться, что вы включили в конец транзакции операторы

COMMIT или ROLLBACK.

Контрольные точки

В любой точке внутри транзакции можно установить контрольную точку.

Контрольные точки позволяют откатывать изменения именно до этого

места. Это может оказаться полезным, если есть очень продолжительная

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

Изменение содержимого таблиц 275

транзакции после того, как для нее установлена контрольная точка, не

нужно будет откатывать данные до самого начала транзакции. Контрольные