Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

TABLOCK vs TABLOCKX


Grande diferença, TABLOCK tentará pegar bloqueios "compartilhados" e TABLOCKX fechaduras exclusivas.

Se você estiver em uma transação e pegar um cadeado exclusivo em uma mesa, EX:

SELECT 1 FROM TABLE WITH (TABLOCKX)

Nenhum outro processo poderá capturar qualquer travas na mesa, significando todos consultas que tentam falar com a mesa serão bloqueadas até que a transação seja confirmada.

TABLOCK apenas pega um bloqueio compartilhado, os bloqueios compartilhados são liberados após a execução de uma instrução se o isolamento da transação for READ COMMITTED (predefinição). Se o seu nível de isolamento for maior, por exemplo:SERIALIZABLE , os bloqueios compartilhados são mantidos até o final de uma transação.

Bloqueios compartilhados são, hmmm, compartilhados. Significa que 2 transações podem ler dados da tabela ao mesmo tempo se ambas tiverem um bloqueio S ou IS na tabela (via TABLOCK ). No entanto, se a transaction A mantém um bloqueio compartilhado em uma tabela, transaction B não poderá obter um bloqueio exclusivo até que todos os bloqueios compartilhados sejam liberados. Leia sobre quais bloqueios são compatíveis com quais no msdn.

Ambas as dicas fazem com que o banco de dados ignore os bloqueios mais granulares (como bloqueios de nível de linha ou página). Em princípio, bloqueios mais granulares permitem uma melhor simultaneidade. Por exemplo, uma transação pode estar atualizando a linha 100 em sua tabela e outra linha 1000, ao mesmo tempo de duas transações (fica complicado com bloqueios de página, mas vamos pular isso).

Em geral, bloqueios granulares são o que você deseja, mas às vezes você pode querer reduzir a simultaneidade de banco de dados para aumentar o desempenho de uma operação específica e eliminar a chance de bloqueios.

Em geral, você não usaria TABLOCK ou TABLOCKX a menos que você absolutamente precise para algum caso extremo.