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

точки следует использовать экономно; вместо этого может оказаться

полезнее реструктурировать транзакцию, создав несколько меньших по

размеру транзакций.

Ниже будет приведен пример с использованием контрольной точки,

но прежде посмотрим цены для товаров № 4 и № 5:

П SELECT product_id, price

FROM producrs

WHERE product_id IN (4, 5);

PRODUCT_ID PRICE

Цена товара № 4 составляет $13.95, а цена товара № 5 - $49.99. Теперь

увеличим цену товара № 4 на 20%:

□ UPDATE products

SET p r ic e = p r ic e * 1.20

WHERE pro du ct_id = 4;

1 row updated.

Установим контрольную точку, которой присвоим имя saveclass="underline"

□ SAVEPOINT sa vel;

Savepoint cre a ted .

Любые операторы DML, которые будут выполнены после этой точки,

могут быть отменены вплоть до этой точки, а изменение для товара № 4

будет сохранено.

Теперь увеличим цену товара № 5 на 30%:

□ UPDATE products

SET p r ic e = p r ic e * 1.30

WHERE produ ct_id = 5;

1 row updated.

Следующий запрос выдаёт цены для двух товаров:

□ SELECT product_id, price

FROM products

WHERE product_id IN (4, 5);

4 13.95

5 49.99

PR0DUCT_ID PRICE

4

5

16.74

64.99

Цена товара № 4 стала выше на 20%, а цена товара № 5 поднялась на 30%.

Откатим сделанные изменения до созданной ранее контрольной точки:

276 Глава 8

□ ROLLBACK ТО SAVEPOINT sa v e l;

R o llb a c k complete.

При выполнении этого оператора новая цена товара № 4 должна

остаться без изменений, а цена товара № 5 должна откатиться к своему

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

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

№ 5:

□ SELECT product_id, price

FROM products

WHERE product_id IN (4, 5);

PRODUCT_ID PRICE

В результате у товара № 4 осталась новая цена ($16.74), а у товара № 5

цена вернулась к первоначальному значению. И, наконец, отменим результаты

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

П ROLLBACK;

R o llb a c k complete.

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

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

цена товара № 4:

□ SELECT product_id, price

FROM producrs

WHERE product_id IN (4, 5);

PRODUCT_ID PRICE

Свойства ACID транзакций

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

логически связанных операторов SQL, результаты выполнения которых

могут быть либо зафиксированы, либо отменены только как единое

целое. В теории баз данных имеется более строгое определение транзакций,

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

четырьмя фундаментальными свойствами, известными как свойства

ACID (первые буквы названий каждого свойства из списка ниже):

■ Атомарность (Atomicity). Транзакции являются атомарными, что

означает, что все входящие в транзакцию операторы SQL рассматриваются

как единая неделимая группа.

■ Согласованность (Consistency). Транзакции гарантируют, что состояние

базы данных остается согласованным и непротиворечивым. Это

4

5

16.74

49.99

4

5

13.95

49.99

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

означает, что база данных начинает работу в одном согласованном

состоянии и заканчивает свою работу (после завершения транзакции)

в другом согласованном состоянии.

■ Изолированность (Isolation). Различные транзакции при своем выполнении

не должны взаимодействовать друг с другом.

■ Долговечность (Durability). После того как результаты выполнения

транзакции зафиксированы, изменения в базе данных будут сохранены

даже в том случае, если компьютер, на котором работает программное

обеспечение базы данных, выйдет из строя.

Программное обеспечение базы данных Oracle поддерживает эти ACID

свойства и обладает широкими возможностями для восстановления баз

данных после системных сбоев.

Параллельно выполняемые транзакции

База данных Oracle поддерживает одновременную работу многих пользователей,

взаимодействующих с базой данных, причем все пользователи

имеют возможность выцолнять свои транзакции одновременно. Такие

транзакции известны как параллельно выполняемые (concurrent).

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

таблицу, результаты выполнения этих транзакций будут отделены друг от

друга до тех пор, пока не будет выполнен оператор COMMIT. Приведенная

ниже последовательность событий, основанных на двух транзакциях (Т1

и Т2), которые обращаются к таблице customers, иллюстрирует разделение

транзакций.

1. Т1 и Т2 выполняют операторы SELECT, отбирающие из таблицы