
Concorrência é a capacidade que o sistema possui, em um ambiente multi-usuário, de permitir que várias transações acessem simultaneamente informações de uma base de dados. O grau de concorrência é o volume de transações executadas pelo sistema durante um determinado intervalo de tempo. Por outro lado, a consistência integral dos dados em um ambiente multi-usuário implica em que alterações efetuadas por uma transação não devem afetar as outras transações em curso.
Para assegurar as características da concorrência e da consistência dos dados, o TSQL usa os métodos de bloqueio automático de linhas e de bloqueio programado de tabelas (comando LOCK TABLE).
Para se obter o melhor grau de concorrência, assegurando a consistência dos dados, é necessário que o esquema de bloqueio permita um balanceamento entre estas características em função da aplicação. Este balanceamento é obtido através do nível de isolamento da aplicação e o uso do comando LOCK TABLE.
No TSQL, os bloqueios podem ser do tipo compartilhado ou exclusivo. Em geral, o sistema coloca um bloqueio compartilhado sobre a linha a ser lida. Este tipo de bloqueio impede que uma outra transação altere a linha durante o tempo de duração do bloqueio. Outras transações podem ler a linha normalmente. O instante em que um bloqueio compartilhado é relaxado depende do nível de isolamento.
Bloqueios exclusivos são colocados sobre as linhas que são alteradas. Quando uma linha possui um bloqueio exclusivo, nenhuma outra transação pode referenciá-la. Bloqueios exclusivos são mantidos até o fim da transação que os gerou.
Os bloqueios acima descritos são automaticamente adquiridos pelo sistema. O nível de isolamento é uma característica de cada aplicação. Se o nível não é especificado, o sistema assume o nível de estabilidade de cursor (nível 1).
Em qualquer nível de isolamento é também possível requerer explicitamente bloqueios de tabelas utilizando o comando LOCK TABLE. Bloqueios de tabelas são automaticamente relaxados no fim de uma transação. Estes bloqueios podem ser automaticamente adquiridos pelo sistema quando é executado um comando que afeta a definição de uma tabela (CREATE INDEX, por exemplo).
O bloqueio de uma tabela deve ser utilizado, no caso de uma transação efetuar operações de leitura ou atualização em um grande número de linhas. Desta forma o sistema não é onerado com a obtenção do bloqueio de cada linha.
Veja também o comando LOCK TABLE.
O nível de isolamento é que determina quando os bloqueios de linha são adquiridos e relaxados pelo sistema. O TSQL oferece os seguintes níveis:
O sistema não mantém bloqueios sobre as linhas referenciadas. A transação só opera com leitura de linhas e não pode efetuar alterações na base de dados. Este nível de bloqueio pode ser utilizado para gerar relatórios sem onerar o sistema na tentativa de obtenção dos bloqueios.
Observa-se que as linhas lidas neste nível podem refletir alterações que não foram ainda confirmadas por um comando COMMIT e que poderão ser ser eventualmente canceladas (comando ROLLBACK).
Bloqueios compartilhados são relaxados na leitura de uma próxima linha da tabela e bloqueios exclusivos são mantidos até o fim da transação. A estabilidade de cursor é utilizada com frequência nas aplicações interativas nas quais os usuários podem percorrer linhas, uma de cada vez. Neste ambiente, só é necessário manter um bloqueio sobre uma linha se esta é modificada. Após a passagem do usuário para a próxima linha, bloqueios sobre linhas não modificadas são relaxados.
Bloqueios compartilhados e exclusivos são mantidos até o fim da transação. Desta forma, linhas lidas não são alteradas por outra transação até o fim da transação na qual elas foram lidas. Este nível provê um alto grau de consistência e uma relativo baixo grau de concorrência.
Este nível de isolamento não garante que toda operação de leitura sobre uma determinada tabela é reproduzível dentro de uma mesma transação, porque é possível a inserção de linhas por parte de uma transação concorrente. Através do comando LOCK TABLE é possível impedir a inserção de linhas na tabela por uma transação.
Toda a base de dados é bloqueada para o usuário. Essencialmente, o sistema passa a operar em modo mono-usuário. Este nível deve ser usado para a execução de operações tais como salvar uma base de dados, recuperar uma base de dados, etc. O gerenciamento de transações não é efetuado, e consequentemente as atualizações na base não podem ser desfeitas através do comando ROLLBACK.
Este nível opera da mesma forma que o nível anterior com a diferença que o gerenciamento de transações é efetuado.
