точки следует использовать экономно; вместо этого может оказаться
полезнее реструктурировать транзакцию, создав несколько меньших по
размеру транзакций.
Ниже будет приведен пример с использованием контрольной точки,
но прежде посмотрим цены для товаров № 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, отбирающие из таблицы