La otra alternativa menos ortodoxa si es que algun camarada no alcanza otra alternativa mejor que el Lock Table, es que lo hagas por aplicativo, o sea programando.
Te suelto una idea, ten una tabla que llames por ejemplo BLOQUEO con un campo y un solo registro con valor cero. Bueno, cuando corres el programa Bath cambias el estado de 0 a 1. Tu aplicativo normal deberá preguntar (usando una función para que sea facil, algo asi como If BdBloqueada Then... y fncBdBloqueada sera una función que solo devuelva true o false) por dicho valor, si lo encuentra en 1 da un mensaje a usuario y se cierra el programa (porque el bath estará trabajando) y si intenta volver a conectarse de entrada no mas lo botas.
Cuando termine el programa de bath vuelves el estado a cero.
El inconveniente que habría es que si por alguna razón el programa bath se queda a la mitad, o si se va la luz o lo que fuera, la BD quedara "bloqueada", entonces deberá haber alguien con los permisos adecuados para que mediante una interfaz cambie el valor de 1 a 0.
El otro punto es que representa un poquito de chamba, deberás llamar a esa función (fncBdBloqueada) antes de entrar a un BeginTrans, o sea, antes de grabar nada... al final se trata de un simple copy/paste por todos los módulos transaccionales. Pon en balanza cual te da mas chamba y cual pueda ser sostenible, si meter mano a bloquear todas las tablas con el lock o meter mano a todos los módulos con la función... o esperar que algun colega venga con el procedimiento MySQL con el cual bloqueas la BD completa de forma exclusiva.
Suerte