Entendendo o controle de concorrência

Baixar o JDBC Driver

O controle de simultaneidade refere-se às várias técnicas que são usadas para preservar a integridade dos bancos de dados quando vários usuários estão atualizando linhas ao mesmo tempo. A concorrência incorreta pode levar a problemas como leituras sujas, leituras fantasma e leituras não repetíveis. O Microsoft JDBC Driver para SQL Server fornece interfaces a todas as técnicas de simultaneidade usadas pelo SQL Server para resolver esses problemas.

Observação

Para obter mais informações sobre a simultaneidade SQL Server, veja "Gerenciando o acesso simultâneo a dados".

Comentários

O driver JDBC oferece suporte aos seguintes tipos de simultaneidade:

Tipo de concorrência Características Bloqueios de linha Descrição
CONCUR_READ_ONLY Somente leitura Não Não são permitidas atualizações pelo cursor e não é mantido nenhum bloqueio nas linhas que compõem o conjunto de resultados.
CONCUR_UPDATABLE Leitura/gravação otimista Não O banco de dados pressupõe que a contenção de linhas é improvável, mas possível. A integridade da linha é verificada por meio da comparação de carimbos de data e hora.
CONCUR_SS_SCROLL_LOCKS Leitura/gravação pessimista Sim O banco de dados assume que a contenção de linhas é provável. A integridade das linhas é garantida por meio do bloqueio de linhas.
CONCUR_SS_OPTIMISTIC_CC Leitura/gravação otimista Não O banco de dados assume que a contenção de linha é improvável, mas possível. A integridade da linha é verificada por meio da comparação de carimbos de data e hora.

Para o SQL Server 2005 (9.x) e versões posteriores, o servidor alterará isso para CONCUR_SS_OPTIMISTIC_CCVAL se a tabela não contiver uma coluna timestamp.

Para o SQL Server 2000 (8.x), se a tabela subjacente tiver uma coluna timestamp, OPTIMISTIC WITH ROW VERSIONING é usado mesmo se OPTIMISTIC WITH VALUES for especificado. Se OPTIMISTIC WITH ROW VERSIONING for especificada e a tabela não tiver marcas de data e hora, OPTIMISTIC WITH VALUES será utilizada.
CONCUR_SS_OPTIMISTIC_CCVAL Leitura e gravação otimistas Não O banco de dados assume que a contenção entre linhas é improvável, mas possível. A integridade da linha é verificada por meio de uma comparação dos dados da linha.

Conjuntos de resultados que não são atualizáveis

Um conjunto de resultados atualizável é um conjunto de resultados no qual linhas podem ser inseridas, atualizadas e excluídas. Nos casos seguintes, o SQL Server não pode criar um cursor atualizável. A exceção gerada é "O conjunto de resultados não é atualizável".

Causa Descrição Solução
A instrução não é criada usando a sintaxe do JDBC 2.0 (ou posterior) O JDBC 2.0 introduziu novos métodos para criar statements. Se a sintaxe do JDBC 1.0 for usada, o conjunto de resultados seguirá o padrão somente leitura. Especifique o tipo de conjunto de resultados e a concorrência ao criar o comando.
O Statement é criado usando TYPE_SCROLL_INSENSITIVE O SQL Server cria um cursor de instantâneo estático. Ele é desconectado das linhas de tabela subjacentes para ajudar a proteger o cursor de atualizações de linha feitas por outros usuários. Use TYPE_SCROLL_SENSITIVE, TYPE_SS_SCROLL_KEYSET, TYPE_SS_SCROLL_DYNAMIC ou TYPE_FORWARD_ONLY com CONCUR_UPDATABLE para evitar criar um cursor estático.
A estrutura da tabela não permite um cursor KEYSET ou DYNAMIC A tabela subjacente não tem chaves exclusivas para permitir que o SQL Server identifique uma linha exclusivamente. Acrescente chaves exclusivas à tabela para fornecer identificação exclusiva de cada linha.