Níveis de isolamento
Quando o bloqueio é usado como o mecanismo de controle de transações, ele pode solucionar problemas de simultaneidade. Ele permite que todas as transações sejam executadas isoladamente de outras, embora mais de uma transação possa ser executada a qualquer momento. O nível no qual uma transação é preparada para aceitar dados inconsistentes é conhecido como nível de isolamento. Um nível de isolamento maior oferece mais proteção em relação à inconsistência de dados, mas a desvantagem é uma diminuição na simultaneidade.
No SQL Server Compact 3.5, o nível de isolamento necessário por um aplicativo determina o comportamento de bloqueio que o SQL Server Compact 3.5 usa.
O SQL Server Compact 3.5 oferece suporte aos seguintes níveis de isolamento (do menor ao maior):
- Leitura confirmada (SQL Server Compact 3.5 padrão)
- Leitura repetida
- Serializável (as transações são completamente isoladas umas das outras)
À medida que aumenta o nível de isolamento, os dados ganham mais proteção em relação à inconsistência de dados. No entanto, isso reduz a simultaneidade da transação e afeta o acesso multiusuário.
Dica
O SQL Server Compact 3.5 não permite que uma transação leia os dados não confirmados de outra transação (leitura suja). Isso é realizado usando um mecanismo de controle de versão de página que permite que os usuários leiam dados sem solicitar bloqueios nos dados. Isso oferece simultaneidade excepcional para operações de leitura (SELECT).
Níveis de isolamento e problemas de simultaneidade
A tabela a seguir mostra os níveis de isolamento e os problemas de simultaneidade que esses níveis experimentam.
Dica
Os problemas de simultaneidade que podem ocorrer incluem a dependência não confirmada, a análise inconsistente e as leituras de itens fantasmas. Para obter mais informações sobre problemas de simultaneidade, consulte Simultaneidade.
Nível de isolamento | Dependência não confirmada (leituras sujas) | Análise inconsistente (leituras não repetidas) | Leituras de itens fantasmas |
---|---|---|---|
Leitura confirmada |
Não |
Sim |
Sim |
Leitura repetida |
Não |
Não |
Sim |
Serializável |
Não |
Não |
Não |
Os níveis de isolamento podem ser definidos de forma programática ou usando a sintaxe SQL SET TRANSACTION ISOLATION LEVEL. Para obter mais informações, consulte Nível de isolamento da transação.
Nível de isolamento no escopo da transação
O nível de isolamento padrão de System.Transaction é Readcommitted. No entanto, por padrão, uma transação em um escopo de transação é executada com o nível de isolamento definido como Serializável. Dessa forma, quando uma conexão do SQL Server Compact 3.5 é inscrita em um escopo de transação, a transação implícita (que é uma transação do SQL Server Compact 3.5 criada internamente para o escopo da transação) é executada por padrão no nível de isolamento Serializável. Alguns dos construtores sobrecarregados da classe do TransactionScope aceitam o nível de isolamento como parâmetro. Eles devem ser usados para especificar um valor diferente do nível de isolamento para a transação implícita. Se o nível de isolamento especificado não tiver suporte no SQL Server Compact 3.5, a inscrição de uma conexão do SQL Server Compact 3.5 em um escopo de transação lançará uma exceção.
Além disso, a propriedade default lock timeout, especificada como parte da cadeia de conexão, controla o tempo que uma transação aguardará. No entanto, quando uma conexão está inscrita para um TransactionScope, o TimeSpan do TransactionScope substitui essa propriedade. Por exemplo, se ConnectionString contivesse 1000 milissegundos como o valor de default lock timeout e a conexão estivesse inscrita em um TransactionScope de 100 milissegundos, a transação do ambiente duraria apenas 100 milissegundos, não 1000. Isso significa que se você deseja que o aplicativo não tenha tempos limites muito longos e execute comandos em um TransactionScope, terá de especificar o valor do tempo limite na cadeia de conexão e no TimeSpan para o TransactionScope.
Dica
O valor padrão de default lock timeou" é 2000 milissegundos e de um TransactionScope é 1 minuto.
Consulte também
Conceitos
Transações (SQL Server Compact)
Bloqueando [SQL Server Compact 3.5]
Cursores (SQL Server Compact)