Puede implementar un comportamiento de "cancelación" de esta manera:
Ejecuta la consulta en un subproceso separado, que sigue ejecutándose ya sea que se agote el tiempo de espera o no. El tiempo de espera se produce en el subproceso principal y establece una variable en "1" que marca que se produjo. Luego haces lo que quieras hacer en tu hilo principal.
El subproceso de consulta, una vez que se completa la consulta, comprueba si se ha agotado el tiempo de espera. Si no lo ha hecho, hace el resto del trabajo que necesita hacer. Si TIENE, simplemente desbloquea las tablas que acaba de bloquear.
Sé que suena un poco derrochador, pero el período de bloqueo y desbloqueo debería ser básicamente instantáneo y te acercarás lo más posible al resultado que deseas.