Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Транзакции задают уровень изоляции, который определяет, как одна транзакция изолируется от других транзакций. Изоляция — это разделение изменений ресурсов или данных, выполненных различными транзакциями. Уровни изоляции описываются с точки зрения того, какие из побочных эффектов параллелизма разрешены (например, чтение фантомных файлов или чтение "грязных" данных).
Уровни изоляции транзакций используются для управления следующими эффектами.
Используются ли блокировки при чтении данных и какой тип блокировок запрашивается.
Как долго удерживаются блокировки чтения.
Выполняются ли операции чтения, обращающиеся к строкам, изменённым другой транзакцией:
Блокировка до освобождения монопольной блокировки строки.
Извлеките зафиксированную версию строки, которая существовала на момент начала выполнения инструкции или транзакции.
Считайте незафиксированные изменения данных.
Выбор уровня изоляции
Выбор уровня изоляции транзакции не влияет на блокировки, полученные для защиты изменений данных. Транзакция всегда получает монопольную блокировку на все данные, которые она изменяет. Она удерживает блокировку до завершения транзакции, независимо от уровня изоляции, установленного для этой транзакции. Для операций чтения уровни изоляции транзакций в основном определяют, как операция защищена от воздействия других транзакций.
Более низкий уровень изоляции повышает возможность одновременного доступа многих пользователей к данным. Однако он приводит к увеличению числа эффектов параллелизма, таких как чтение "грязных" данных или потерянные обновления, с которыми могут сталкиваться пользователи. Более высокий уровень изоляции транзакции, напротив, уменьшает число эффектов параллелизма, с которыми могут сталкиваться пользователи. Но он требует больше системных ресурсов и увеличивает вероятность того, что одна транзакция будет блокировать другую. Выбор соответствующего уровня изоляции зависит от баланса между требованиями к целостности данных приложения и издержек каждого уровня изоляции.
Самый высокий уровень изоляции, сериализация, гарантирует, что транзакция будет получать одни и те же данные при повторных операциях чтения. Однако он использует уровень блокировки, который, вероятно, затронет других пользователей в многопользовательских системах. Самый низкий уровень изоляции, чтение незафиксированных данных, позволяет считывать данные, измененные, но не зафиксированные другими транзакциями. При уровне изоляции Read Uncommitted возможны все побочные эффекты параллелизма, однако блокировки чтения и управление версиями не используются, поэтому накладные расходы сводятся к минимуму.
Замечания
В следующей таблице перечислены побочные эффекты параллелизма, допустимые для различных уровней изоляции.
| Уровень изоляции | Чтение «грязных» файлов | Неповторяемое чтение | Фантом |
|---|---|---|---|
| Чтение незафиксированных данных | Да | Да | Да |
| Чтение подтверждённых данных | Нет | Да | Да |
| Повторяемое чтение | Нет | Нет | Да |
| Снимок | Нет | Нет | Нет |
| Сериализуемый | Нет | Нет | Нет |
Транзакции должны выполняться на уровне изоляции не ниже повторяемого чтения, чтобы предотвратить потерю обновлений, которая может возникнуть, когда две транзакции считывают одну и ту же строку. Затем транзакция обновляет строку на основе первоначально полученных значений. Если две транзакции обновляют строки с помощью одного оператора UPDATE и не основывают это обновление на ранее полученных значениях, потерянные обновления не происходят на уровне изоляции Read Committed, используемом по умолчанию.
Чтобы задать уровень изоляции транзакции, можно использовать метод setTransactionIsolation класса SQLServerConnection. Этот метод принимает значение int в качестве аргумента, который в качестве основы использует одну из констант соединения, как описано ниже.
con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
Чтобы использовать новый уровень изоляции snapshot в SQL Server, можно использовать одну из следующих SQLServerConnection констант:
con.setTransactionIsolation(SQLServerConnection.TRANSACTION_SNAPSHOT);
или можно использовать:
con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED + 4094);
Дополнительные сведения об уровнях изоляции SQL Server см. в статье "Уровни изоляции в ядре СУБД" в электронной документации SQL Server.