18. Неблагоприятные эффекты, вызванные параллельным выполнением транзакций, и их устранение - KattyOG/Database GitHub Wiki
- проблема последнего изменения возникает, когда несколько пользователей изменяют одну и ту же строку, основываясь на ее начальном значении; тогда часть данных будет потеряна, т.к. каждая последующая транзакция перезапишет изменения, сделанные предыдущей. Выход из этой ситуации заключается в последовательном внесении изменений;
- проблема "грязного" чтения (Dirty Read) возможна в том случае, если пользователь выполняет сложные операции обработки данных, требующие множественного изменения данных перед тем, как они обретут логически верное состояние. Если во время изменения данных другой пользователь будет считывать их, то может оказаться, что он получит логически неверную информацию. Для исключения подобных проблем необходимо производить считывание данных после окончания всех изменений;
- проблема неповторяемого чтения (Non-repeatable or Fuzzy Read) является следствием неоднократного считывания транзакцией одних и тех же данных. Во время выполнения первой транзакции другая может внести в данные изменения, поэтому при повторном чтении первая транзакция получит уже иной набор данных, что приводит к нарушению их целостности или логической несогласованности;
- проблема чтения фантомов (Phantom) появляется после того, как одна транзакция выбирает данные и з таблицы, а другая вставляет или удаляет строки до завершения первой. Выбранные из таблицы значения будут некорректны.
В стандарте ANSI SQL определены четыре уровня блокирования:
- уровень 0 - запрещение « загрязнения » данных. Этот уровень требует, чтобы изменять данные могла только одна транзакция; если другой транзакции необходимо изменить те же данные, она должна ожидать за вершения первой транзакции;
- уровень 1 - запрещение « грязного » чтения. Если транзакция начала изменение данных, то никакая другая транзакция не сможет прочитать их до завершения первой;
- уровень 2 - запрещение неповторяемого чтения. Если транзакция считыва ет данные, то никакая другая транзакция не сможет их изменить. Таким образом, при повторном чтении они будут находиться в первоначальном состоянии;
-
уровень 3 - запрещение фантомов. Если транзакция обращается к данным, то никакая другая транзакция не сможе т
добавить новые или удалить имеющие строки, которые могут быть считаны при выполнении транзакции. Реализация
этого уровня блокирования выполняется путем использования блокировок диапазона ключей. Подобная блокировка
накладывается не на конкретные строки т аблицы, а на строки, удовлетворяющие определенному логическому условию.
Проблемы, связанные с параллельным выполнением транзакций, разрешают, используя уровни изоляции транзакции. От
уровня изоляции зависит то, в какой степени транзакция влияет на другие транзакции и испытывает влияние других
транзакций. Более низкий уровень изоляции увеличивает возможность параллельного выполнения, но за это приходится
расплачиваться согласованностью данных. Напротив, более высокий уровень изоляции гарантирует согласованн ость
данных, но при этом страдает параллельное выполнение.
Стандарт ISO определяет следующие уровни изоляции:
- read uncommitted (самый низкий уровень, при котором транзакции изолируются до такой степени, чтобы только уберечь от считывания физически поврежденных данных);
- read committed (уровень по умолчанию);
- изоляция повторяющегося чтения repeatable read;
- изоляция упорядочиваемых транзакций serializable (самый высокий уровень, при котором транзакции полностью изолированы друг от друга). SQL Server также поддерживает еще два уровня изоляции транзакций, использующих управление версиями строк.
- read committed с использованием управления версиями строк;
- уровень изоляции моментальных снимков snapshot.
Для установки уровня изоляции используется следующая инструкция SET TRANSACTION ISOLATION LEVEL, имеющая следующий синтаксис:
SET TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SNAPSHOT | SERIALIZABLE }
[ ; ]