Puoi implementare un comportamento "simile all'annullamento" in questo modo:
Si esegue la query su un thread separato, che continua a essere eseguito indipendentemente dal verificarsi del timeout. Il timeout si verifica sul thread principale e imposta una variabile su "1" che indica che si è verificato. Quindi fai quello che vuoi fare sul tuo thread principale.
Il thread della query, una volta completata la query, verifica se si è verificato il timeout. In caso contrario, fa il resto del lavoro che deve fare. Se HA, sblocca semplicemente i tavoli che ha appena bloccato.
So che suona un po' dispendioso, ma il periodo di blocco-sblocco dovrebbe essere praticamente istantaneo e ti avvicini il più possibile al risultato desiderato.