Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A concorrência otimista deriva o seu nome da suposição otimista de que colisões entre transações raramente ocorrerão; Diz-se que ocorreu uma colisão quando outra transação atualiza ou elimina uma linha de dados entre o momento em que é lida pela transação atual e o momento em que é atualizada ou eliminada. É o oposto da concorrência pessimista, ou bloqueio, em que o programador da aplicação acredita que tais colisões são comuns.
Na concorrência otimista, uma linha de dados fica desbloqueada até chegar o momento de a atualizar ou eliminar. Nesse momento, a linha é relida e verificada para ver se foi alterada desde a última vez que foi lida. Se a linha mudou, a atualização ou eliminação falha e tem de ser tentada novamente.
Para determinar se uma linha foi alterada, a sua nova versão é verificada com uma versão em cache da linha. Esta verificação pode basear-se na versão da linha, como a coluna de carimbo temporal no SQL Server, ou nos valores de cada coluna da linha. Muitos SGBD não suportam versões de linha.
A concorrência otimista pode ser implementada pela fonte de dados ou pela aplicação. Em qualquer dos casos, a aplicação deve usar um nível baixo de isolamento de transações, como Read Committed; usar um nível mais alto anula o aumento de concorrência obtido com a utilização de concorrência otimista.
Se a concorrência otimista for implementada pela fonte de dados, a aplicação define o atributo da instrução SQL_ATTR_CONCURRENCY para SQL_CONCUR_ROWVER ou SQL_CONCUR_VALUES. Para atualizar ou eliminar uma linha, executa uma instrução de atualização ou exclusão posicionada ou chama SQLSetPos tal como faria com concorrência pessimista; o driver ou fonte de dados devolve SQLSTATE 01001 (conflito de operação do cursor) se a atualização ou eliminação falhar devido a uma colisão.
Se a própria aplicação implementar concorrência otimista, define o atributo da instrução SQL_ATTR_CONCURRENCY a SQL_CONCUR_READ_ONLY para ler uma linha. Se tiver de comparar versões de linha e não conhece a coluna de versão da linha, chama SQLSpecialColumns com a opção SQL_ROWVER para determinar o nome daquela coluna.
A aplicação atualiza ou elimina a linha ao elevar a concorrência para SQL_CONCUR_LOCK (para obter acesso de escrita à linha) e executa uma instrução UPDATE ou DELETE com uma cláusula WHERE que especifica a versão ou os valores dos dados no momento em que a aplicação realizou a leitura da linha. Se a linha tiver sido alterada desde então, a instrução falhará. Se a cláusula WHERE não identificar de forma única a linha, a instrução pode também atualizar ou eliminar outras linhas; as versões das linhas identificam sempre as linhas de forma única, mas os valores das linhas só as identificam de forma única se incluírem a chave primária.