La seule façon dont cela peut se produire (dans une session client) - et la façon dont cela se produit pour moi de temps en temps - est que vous obtenez peu à peu un court délai d'attente sur la connexion client. Ça se passe comme ça :
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)
Vous devez initialiser vos variables et les utiliser dans une session client contiguë. Lorsque la session se termine, vous perdez toutes vos variables.
L'autre explication, comme l'ont souligné d'autres dans les commentaires, est que les commandes frappent le serveur à partir de différentes connexions; votre problème n'est peut-être pas un délai d'attente, mais que vous lancez les commandes "SET ..." et "SELECT ..." dans différentes connexions. Les variables utilisateur ne sont pas partagées entre différentes connexions.