Влияние точки сохранения на уровни изоляции
Теперь, когда вы познакомились с точками сохранения, воспользуемся ими для настройки серии транзакций, которым необходимо работать с одним и тем же начальным снимком данных. REPEATABLE READ — это уровень изоляции, при котором каждый оператор внутри транзакции получает те же данные, что и первый оператор, а не данные, изменённые предыдущими операторами.
Недавно FFEIC разрешила поэтапное сокращение иностранных депозитов: поле RCON2203 в наборе данных содержит значения в тысячах долларов. Новые коэффициенты сокращения составляют: 35% для сумм свыше 1 миллиарда долларов, 25% для сумм свыше 500 миллионов долларов и 13% для сумм свыше 300 миллионов долларов. Порядок операторов можно выстроить так, чтобы данные не уменьшались более одного раза. Однако при использовании REPEATABLE READ каждый оператор работает с данными до применения каких-либо изменений.
Это упражнение является частью курса
Транзакции и обработка ошибок в PostgreSQL
Инструкции к упражнению
- Начните транзакцию с уровнем изоляции
REPEATABLE READ. - Уменьшите значение
RCON2203на 35%, если оно превышает 1 миллиард долларов, на 25% — если превышает 500 миллионов долларов, или на 13% — если превышает 300 миллионов долларов, устанавливаяSAVEPOINTпосле каждого шага. - Завершите транзакцию.
- Подсчитайте суммарное значение поля
RCON2203.
Интерактивное практическое упражнение
Попробуйте выполнить это упражнение, дополнив этот пример кода.
-- Create a new transaction with a repeatable read isolation level
___ TRANSACTION ISOLATION LEVEL ___ ___;
-- Update records with a 35% reduction if greater than 1000000000
UPDATE ffiec_reci
SET ___ = CAST(___ AS FLOAT) * .65
WHERE CAST(RCON2203 AS FLOAT) > 1000000000;
___ million;
-- Update records with a 25% reduction if greater than 500000000
UPDATE ___
___ ___ = CAST(___ AS FLOAT) * .75
___ CAST(RCON2203 AS FLOAT) ___ 500000000;
SAVEPOINT five_hundred;
-- Update records with a 13% reduction if greater than 300000000
___ ffiec_reci
___ ___ = CAST(___ AS FLOAT) * .87
___ CAST(___ AS FLOAT) ___ 300000000;
SAVEPOINT three_hundred;
-- Commit the transaction
___;
-- Select SUM the RCON2203 field
SELECT ___(CAST(RCON2203 AS FLOAT))
FROM ffiec_reci