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.