Jedyny sposób, w jaki może się to zdarzyć (w sesji klienta) - i sposób, w jaki to się dzieje od czasu do czasu - to krótki czas oczekiwania na połączenie klienta. To wygląda tak:
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)
Musisz zainicjować swoje zmienne i używać ich w ciągłej sesji klienta. Po zakończeniu sesji tracisz wszystkie zmienne.
Innym wyjaśnieniem, jak wskazali inni w komentarzach, jest to, że polecenia trafiają do serwera z różnych połączeń; Twoim problemem może nie być przekroczenie limitu czasu, ale to, że polecenia "SET ..." i "SELECT ..." są inicjowane w różnych połączeniach. Zmienne użytkownika nie są współdzielone przez różne połączenia.