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 é a capacidade de duas transações usarem os mesmos dados ao mesmo tempo e, com o aumento do isolamento das transações, normalmente vem uma redução da concorrência. Isto deve-se ao facto de o isolamento das transações ser geralmente implementado bloqueando linhas, e à medida que mais linhas são bloqueadas, menos transações podem ser concluídas sem serem bloqueadas, pelo menos temporariamente, por uma linha bloqueada. Embora a redução da simultaneidade seja geralmente aceite como uma compensação para os níveis mais elevados de isolamento de transações necessários para manter a integridade da base de dados, esta pode tornar-se um problema em aplicações interativas, com elevada atividade de leitura/escrita, que utilizam cursores.
Por exemplo, suponha que uma aplicação executa a instrução SQL SELECT * FROM Orders. Chama SQLFetchScroll para percorrer o conjunto de resultados e permite ao utilizador atualizar, eliminar ou inserir ordens. Após o utilizador atualizar, apagar ou inserir uma encomenda, a aplicação confirma a transação.
Se o nível de isolamento for Leitura Repetível, a transação pode – dependendo de como é implementada – bloquear cada linha devolvida pelo SQLFetchScroll. Se o nível de isolamento for serializável, a transação pode bloquear toda a tabela de Encomendas. Em qualquer dos casos, a transação só liberta os bloqueios quando é confirmada ou revertida. Assim, se o utilizador passar muito tempo a ler ordens e muito pouco tempo a atualizá-las, eliminá-las ou inseri-las, a transação pode facilmente bloquear um grande número de linhas, tornando-as indisponíveis para outros utilizadores.
Isto é um problema mesmo que o cursor seja apenas de leitura e a aplicação permita ao utilizador ler apenas ordens existentes. Neste caso, a aplicação confirma a transação e liberta bloqueios quando chama SQLCloseCursor (em modo de auto-commit) ou SQLEndTran (em modo de commit manual).
Esta seção contém os seguintes tópicos.