A única maneira de isso acontecer (em uma sessão de cliente) - e da maneira que acontece comigo de tempos em tempos - é você ser mordido por um curto tempo limite na conexão do cliente. Fica assim:
mysql> set @a = 10;
mysql> [wait for N+1 minutes, where N is the client timeout]
mysql> select @a;
+------+
| NULL |
+------+
| NULL |
+------+
1 row in set (0.00 sec)
Você precisa inicializar suas variáveis e usá-las em uma sessão de cliente contígua. Quando a sessão vai embora, você perde todas as suas variáveis.
A outra explicação, como apontado por outros nos comentários, é que os comandos estão atingindo o servidor de conexões diferentes; seu problema pode não ser um timeout, mas que você está originando os comandos "SET ..." e "SELECT ..." em conexões diferentes. As variáveis de usuário não são compartilhadas entre diferentes conexões.