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


Уровни изоляции

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

Необходимый для приложения уровень изоляции определяет режим работы блокировок, используемых SQL Server Compact.

SQL Server Compact поддерживает следующие уровни изоляции (от низшего к высшему):

  • Чтение зафиксированных данных (стандартный параметр SQL Server Compact)

  • Повторяющееся чтение

  • Сериализация (транзакции полностью изолируются друг от друга)

По мере повышения уровня изоляции данные становятся менее подверженными непоследовательности. Однако это уменьшает параллелизм транзакции и влияет на многопользовательский доступ.

Примечание

SQL Server Compact следит за тем, чтобы одна транзакция не могла прочесть незафиксированные данные другой транзакции ("грязное" чтение). Это достигается за счет использования механизма указания версий страниц, который позволяет пользователям считывать данные, не запрашивая блокировки S для данных. Это обеспечивает исключительный параллелизм операций чтения (SELECT).

Уровни изоляции и проблемы параллелизма

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

Примечание

К числу возможных проблем параллелизма относятся зависимость от незафиксированных данных, непоследовательный анализ и чтение фантомов. Дополнительные сведения о проблемах параллелизма см. в разделе Параллелизм.

Уровень изоляции

Зависимость от незафиксированных данных ("грязное" чтение)

Непоследовательный анализ (неповторяющееся чтение)

Чтение фантомов

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

Нет

Да

Да

Повторяющееся чтение

Нет

Нет

Да

Сериализация

Нет

Нет

Нет

Уровни изоляции задаются либо программным путем, либо с помощью синтаксиса SQL SET TRANSACTION ISOLATION LEVEL. Дополнительные сведения см. в разделе Уровень изоляции транзакций.

Уровень изоляции в области транзакции

По умолчанию для System.Transaction задан уровень изоляции Readcommitted. Однако транзакции в области видимости транзакций по умолчанию выполняются с уровнем изоляции Serializable. Таким образом, при прикреплении соединения SQL Server Compact в области видимости транзакции неявная транзакция (то есть транзакция SQL Server Compact, созданная внутри области видимости транзакций) по умолчанию будет работать с уровнем изоляции Serializable. Некоторые перегруженные конструкторы класса TransactionScope принимают уровень изоляции в качестве параметра. Эту возможность можно использовать для указания иного значения уровня изоляции для неявных транзакций. Если указанный уровень изоляции не поддерживается SQL Server Compact, то прикрепление соединения с SQL Server Compact в область видимости транзакций вызовет исключение.

Свойство default lock timeout, указанное в строке соединения, определяет время ожидания транзакций, но при прикреплении соединения к TransactionScope свойство TimeSpan объекта TransactionScope будет иметь больший приоритет. Например, если в строке соединения указан параметр default lock timeout со значением 1000 мс и прикрепляется соединение со значением TransactionScope, равным 100 мс, то внешняя транзакция просуществует только 100 мс, а не 1000 мс. Это значит, что если в приложении необходимо более длительное время ожидания транзакций при запуске команд в TransactionScope, необходимо указывать время ожидания как в строке подключения, так и в свойстве TimeSpan объекта TransactionScope.

Примечание

По умолчанию значение default lock timeou составляет 2000 мс, а значение TransactionScope — 1 мин.

См. также

Основные понятия

Транзакции (SQL Server Compact)

Блокировки (SQL Server Compact)

Курсоры (SQL Server Compact)