Поделиться через


Основные сведения об уровнях изоляции

Скачать драйвер JDBC

Транзакции задают уровень изоляции, который определяет, как одна транзакция изолируется от других транзакций. Изоляция — это разделение изменений ресурсов или данных, выполненных различными транзакциями. Уровни изоляции описываются с точки зрения того, какие из побочных эффектов параллелизма разрешены (например, чтение фантомных файлов или чтение "грязных" данных).

Уровни изоляции транзакций используются для управления следующими эффектами.

  • Применение и типы блокировки при чтении данных.

  • Время удержания блокировок чтения.

  • Использование операции чтения для строк, измененных другой транзакцией.

    • Блокировка до освобождения монопольной блокировки строки.

    • Извлечение фиксированной версии строки, существующей в момент запуска инструкции или транзакции.

    • Чтение нефиксированных изменений данных.

Выбор уровня изоляции

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

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

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

Remarks

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

Уровень изоляции Чтение «грязных» файлов Операции чтения без возможности повторения Фантомный
Уровень изоляции read uncommitted Да Да Да
Уровень изоляции read committed Нет Да Да
Уровень изоляции repeatable read Нет Нет Да
Моментальный снимок нет Нет нет
Упорядочиваемый уровень изоляции Нет Нет нет

Транзакции должны выполняться на уровне изоляции не ниже операции чтения с возможность повтора, чтобы предотвратить потерю обновлений, которая может возникнуть, когда две транзакции получают одну и ту же строку. Затем транзакция обновляет строку на основе первоначально полученных значений. Если две транзакции обновляют строки с использованием одной инструкции UPDATE и не используют при обновлении полученные ранее значения, то на уровне изоляции read committed, который задан по умолчанию, возможны потери обновлений.

Чтобы задать уровень изоляции транзакции, можно использовать метод setTransactionIsolation класса SQLServerConnection. Этот метод принимает значение int в качестве аргумента, который в качестве основы использует одну из констант соединения, как описано ниже.

con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

Чтобы использовать новый уровень изоляции моментального снимка SQL Server, можно использовать одну из констант SQLServerConnection:

con.setTransactionIsolation(SQLServerConnection.TRANSACTION_SNAPSHOT);

или можно использовать:

con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED + 4094);

Дополнительные сведения об уровнях изоляции SQL Server см. в разделе "Уровни изоляции в компоненте Компонент Database Engine" электронной документации SQL Server.

См. также раздел

Выполнение транзакций с помощью JDBC Driver
SET TRANSACTION ISOLATION LEVEL (Transact-SQL)