# 35

Аноним Funnybluejeans

Уровень изолированности транзакций - значение, определяющее уровень, при котором в транзакции допускаются несогласованные данные, то есть степень изолированности одной транзакции от другой.

При параллельном выполнении транзакций возможны следующие проблемы:

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

"грязное" чтение - чтение данных, добавленных или изменённых транзакцией, которая впоследствии откатится;

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

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

Уровень изолированности READ UNCOMMITTED разрешает грязное чтение. Oracle не использует грязного чтения, и не допускает его. Основное назначение уровня изолированности READ UNCOMMITTED - стандартное определение не блокирующего чтения.

create table accounts (account_number number primary key, account_balance number) ;

select sum(account balance) from accounts;


SELECT начинает выполняться и читать строку 1, строку 2 и так далее. В какой-то момент выполнения запроса некая транзакция переводит 400,00 $ со счета 123 на счет 987. Эта транзакция делает два изменения, но не фиксирует их. Таблица теперь выглядит следующим образом:


Добравшись до заблокированного блока, выполняемый запрос "поймет", что данные в нем изменились после начала выполнения. Чтобы дать правильный ответ, сервер Oracle в этот момент восстановит блок с заблокированными данными в том виде, как он был на момент начала выполнения запроса.

Уровень изолированности READ COMMITTED требует, чтобы транзакция читала только данные, зафиксированные до ее начала. Никаких грязных чтений. Неповторямость при чтении допускается, как и чтение фантомов. READ COMMITTED, вероятно, - наиболее часто и повсеместно используемый. Другие используются редко.

Результат запроса к таблице счетов при уровне изолированности READ COMMITTED будет таким же, как и в примере с READ UNCOMMITTED.

Repeatable read (повторяемость чтения) - Уровень, при котором чтение одной и той же строки или строк в транзакции дает одинаковый результат. (Пока транзакция не завершена, никакие другие транзакции не могут модифицировать эти данные.)

Serializable (упорядочиваемость) - Самый высокий уровень изолированности; транзакции полностью изолируются друг от друга. Изменения от других транзакций для такой транзакции невидимы, независимо от того, как долго она выполняется.