Уровень изоляции транзакций
По умолчанию Microsoft SQL Server Compact 4.0 работает с уровнем изоляции Read Committed. Однако может возникнуть необходимость выполнения приложения на другом уровне изоляции. Для использования в приложениях других уровней изоляции можно настроить блокировку для всего сеанса, установив уровень изоляции сеанса инструкцией SET TRANSACTION ISOLATION LEVEL.
Важно!
Хотя по умолчанию в SQL Server Compact 4.0 установлен уровень изоляции чтения зафиксированных данных, его использование не позволяет принимать блокировки S при чтении данных. Подобный характер работы отличен от MicrosoftSQL Server. Когда в SQL Server используется чтение зафиксированных данных, при каждом чтении строки запрашивается блокировка, причем, если с этой строкой связана конфликтующая блокировка, операция будет ждать ее разрешения. SQL Server Compact 4.0 не требует блокировки S благодаря автоматической поддержке версий страниц данных, обеспечивающей чтение зафиксированных данных без применения блокировки. Эта возможность полезна, поскольку в SQL Server Compact 4.0 операции SELECT не требуют блокировок данных и практически всегда успешны. В отличие от SQL Server, операциям SELECT здесь не приходится ожидать, если у данных имеется блокировка X. Тем не менее операциям SELECT требуется блокировка Sch-S. Операцию не удастся выполнить, только если в данный момент таблица изменяется, поскольку при этом действует конфликтующая блокировка Sch-X.
После указания уровня изоляции блокировка применяется для всех инструкций SELECT в сеансе SQL Server Compact 4.0 на этом уровне изоляции и поддерживается до завершения сеанса или изменения уровня изоляции. Например, чтобы установить упорядочиваемый уровень изоляции транзакции и избежать вставки фантомных строк параллельными транзакциями в таблицу «Employee», используйте следующую инструкцию SQL:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
SELECT EmployeeID FROM Employee;
Кроме того, уровень изоляции транзакции можно установить программным путем. В следующем примере показано, как установить уровень изоляции транзакции с помощью ADO .NET:
SqlTransaction myTrans;
myTrans = myConnection.BeginTransaction(IsolationLevel.RepeatableRead);