De acordo com o manual do MySQL 5.1, seção 13.7.6.4 Sintaxe KILL , quando você faz kill
uma conexão, um sinalizador de interrupção específico da thread é definido para a thread . O sinalizador será verificado de tempos em tempos, mesmo durante algumas consultas de execução longa, para que possa interromper a consulta.
Existe uma maneira de instruir um thread a não verificar o sinalizador de interrupção enquanto estiver dentro de algum tipo de seção crítica delimitada?
O que estou procurando é algo como:
BEGIN IGNORE_KILLS;
-- if this thread is killed here, it will simply ignore it
END IGNORE_KILLS;
-- here, the thread would be able to tell if someone tried to kill it previously
Supondo que não exista, ou que alguém possa me oferecer uma solução melhor para o meu problema, deixe-me explicar por que eu o desejaria.
Tenho uma aplicação que deve reagir a linhas que são inseridas em uma tabela, e esta deve ser escalável. Segundo o especialista em MySQL Baron Schwartz , não se deve ficar fazendo polling no banco de dados e ele propõe, como alternativa, usar SELECT SLEEP(...)/KILL
.
O problema é que depois que a conexão em espera select sleep(...)
for notificada (ao ser morta) que tem trabalho a fazer, gostaria de garantir que, durante o seu trabalho (o que chamei de seção crítica acima), ela não vai parar de fazer o que deve funcionar mesmo no caso de o thread assassino enlouquecer e matá-lo novamente.