Основные сведения об уровнях изоляции
Транзакции задают уровень изоляции, который определяет, как одна транзакция изолируется от других транзакций. Изоляция — это разделение изменений ресурсов или данных, выполненных различными транзакциями. Уровни изоляции описываются с точки зрения того, какие из побочных эффектов параллелизма разрешены (например, чтение фантомных файлов или чтение "грязных" данных).
Уровни изоляции транзакций используются для управления следующими эффектами.
Применение и типы блокировки при чтении данных.
Время удержания блокировок чтения.
Использование операции чтения для строк, измененных другой транзакцией.
Блокировка до освобождения монопольной блокировки строки.
Извлечение фиксированной версии строки, существующей в момент запуска инструкции или транзакции.
Чтение нефиксированных изменений данных.
Выбор уровня изоляции
Выбор уровня изоляции транзакции не влияет на блокировки, полученные для защиты изменений данных. Транзакция всегда получает монопольную блокировку на любые данные, которые она изменяет. Она удерживает блокировку до завершения транзакции, независимо от уровня изоляции, установленного для этой транзакции. Для операций чтения уровни изоляции транзакций в основном определяют, как операция защищена от воздействия других транзакций.
Более низкий уровень изоляции транзакции повышает вероятность одновременного доступа нескольких пользователей к данным. Однако он приводит к увеличению числа эффектов параллелизма, таких как чтение "грязных" данных или потерянные обновления, с которыми могут сталкиваться пользователи. Более высокий уровень изоляции транзакции, напротив, уменьшает число эффектов параллелизма, с которыми могут сталкиваться пользователи. Но он требует больше системных ресурсов и увеличивает вероятность того, что одна транзакция будет блокировать другую. Выбор соответствующего уровня изоляции зависит от баланса между требованиями к целостности данных приложения и издержек каждого уровня изоляции.
Самый высокий уровень изоляции, сериализация, гарантирует, что транзакция будет получать одни и те же данные при повторных операциях чтения. Однако для него используется уровень блокировки, который, скорее всего, повлияет на других пользователей в системах с несколькими пользователями. Самый низкий уровень изоляции, незафиксированная операция чтения, может использоваться для извлечения измененных данных, изменения которых не были зафиксированы другими транзакциями. Возникновение всех побочных эффектов параллелизма возможно в незафиксированных операциях чтения, однако при этом не поддерживается блокировка чтения или управление версиями, за счет чего сокращаются дополнительные затраты.
Замечания
В следующей таблице перечислены побочные эффекты параллелизма, допустимые для различных уровней изоляции.
Уровень изоляции | Чтение «грязных» файлов | Операции чтения без возможности повторения | Искусственный |
---|---|---|---|
Уровень изоляции read uncommitted | Да | Да | Да |
Чтение подтверждено | No | Да | Да |
Уровень изоляции repeatable read | No | No | Да |
Моментальный снимок | No | No | No |
Упорядочиваемый уровень изоляции | No | No | No |
Транзакции должны выполняться на уровне изоляции не ниже операции чтения с возможность повтора, чтобы предотвратить потерю обновлений, которая может возникнуть, когда две транзакции получают одну и ту же строку. Затем транзакция обновляет строку на основе первоначально полученных значений. Если две транзакции обновляют строки с использованием одной инструкции 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 см. в статье "Уровни изоляции в ядро СУБД" в электронной документации по SQL Server.
См. также
Выполнение транзакций с помощью JDBC Driver
SET TRANSACTION ISOLATION LEVEL (Transact-SQL)