Compartilhar via


Controle de simultaneidade

Simultaneidade é a capacidade de duas transações usarem os mesmos dados ao mesmo tempo e, com o aumento do isolamento de transações, geralmente vem a simultaneidade reduzida. Isso ocorre porque o isolamento de transações 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 simultaneidade reduzida seja geralmente aceita como uma compensação para os níveis mais altos de isolamento de transações necessários para manter a integridade do banco de dados, ela pode se tornar um problema em aplicativos interativos com alta atividade de leitura/gravação que usam cursores.

Por exemplo, suponha que um aplicativo execute a instrução SQL SELECT * FROM Orders. Ele chama SQLFetchScroll para rolar ao redor do conjunto de resultados e permite que o usuário atualize, exclua ou insira ordens. Depois que o usuário atualiza, exclui ou insere um pedido, o aplicativo confirma a transação.

Se o nível de isolamento for Leitura Repetível, a transação poderá - dependendo de como for implementada - bloquear cada linha retornada por SQLFetchScroll. Se o nível de isolamento for Serializável, a transação poderá bloquear toda a tabela Orders. Em ambos os casos, a transação libera seus bloqueios somente quando é confirmada ou revertida. Assim, se o usuário gasta muito tempo lendo ordens e muito pouco tempo atualizando, excluindo ou inserindo-as, a transação pode facilmente bloquear um grande número de linhas, tornando-as indisponíveis para outros usuários.

Isso é um problema mesmo se o cursor for somente leitura e o aplicativo permitir que o usuário leia apenas pedidos existentes. Nesse caso, o aplicativo confirma a transação e libera bloqueios quando chama SQLCloseCursor (no modo de confirmação automática) ou SQLEndTran (no modo de confirmação manual).

Esta seção contém os tópicos a seguir.