Spinlock (Parte I)
Tenho recebido uma série de emails perguntando sobre SPINLOCK e infelizmente não tive tempo para escrever muito sobre o assunto. Há um post antigo: Spinlock Contention, mas vejo que falta mais coisa. Vou escrever esse artigo para dar uma idéia sobre o spinlock e, em seguida, mostrarei seu funcionamento.
Primeiro, devemos traduzir literalmente a palavra spinlock:
- SPIN = Rodar
- LOCK = Bloqueio
Isso dá uma pista inicial de que a estrutura de Spinlock corresponde a um lock na qual a thread fica rodando, muito semelhante a um loop infinito.
Em T-SQL, isso corresponde a um código assim:
SET LOCK_TIMEOUT 0 SpinLoop: UPDATE tabela SET coluna = 'bla' IF @@ERROR <>0 goto SpinLoop
Analisando o código em uma situação na qual a tabela está bloqueada, observamos que esse código utiliza um LOOP INFINITO até que a tabela seja atualizada.
Meu experimento foi colocar um bloqueio propositalmente na tabela e em seguida rodar o SpinLock. O resultado foram 34074 mensagens repetidas como apresentadas abaixo, podendo dizer assim que houve 1 colisão e 34074 spins:
Msg 1222, Level 16, State 56, Line 3 Lock request time out period exceeded. Msg 1222, Level 16, State 56, Line 3 Lock request time out period exceeded. Msg 1222, Level 16, State 56, Line 3 Lock request time out period exceeded. ... Msg 1222, Level 16, State 56, Line 3 Lock request time out period exceeded.
A vantagem desse código é que nenhum LOCK é efetivamente utilizado. Por outro lado, a CPU vai para 100% imediatamente.
O OBJETIVO DESSE CÓDIGO É ILUSTRAR A IDÉIA POR TRÁS DO SPINLOCK. JAMAIS USE ESTE CÓDIGO!
No próximo post, colocarei a descrição do “verdadeiro” spinlock.