Justamente el problema del WAIT es que la espera puede llegar a ser eterna. Ejemplo:
- María inició una transacción
- Mientras estaba ingresando datos, la llamó Raúl, su novio y la invitó a almorzar porque tenía que contarle una muy buena noticia
- Como ya era su hora del almuerzo aceptó la invitación
- Él le contó que se ganó la Lotería y la invitó a pasear por Europa, y que el vuelo sale dentro de dos horas
- Ella aceptó encantada y se fueron corriendo hasta su casa para buscar ropas y de allí al aeropuerto
- Y se olvidó totalmente de su trabajo
Todas las demás transacciones que quieran borrar/actualizar las filas que estaba usando la transacción de María serán rechazadas. La única solución en ese caso es detectar el número de la transacción de María y eliminarla, pero algo así solamente lo pueden hacer SYSDBA o el creador de la Base de Datos.
Y si por muy mala suerte, SYSDBA, el creador de la Base de Datos y María son la misma persona, jamás podrán eliminar a esa transacción. Y la Base de Datos irá creciendo, creciendo, creciendo, y cada vez se tornará más y más lenta.
Por eso, algunas recomendaciones:
- Todas tus transacciones deben ser muy cortas
- A todas las transacciones WAIT agregarles la cláusula LOCK TIMEOUT, la cual espera una cierta cantidad de segundos, transcurridos los cuales devuelve un mensaje de error. En general, 5 segundos es un tiempo prudencial en una LAN pero si el acceso es mediante Internet podrías usar 10 o inclusive un poco más.
Los mensajes de error el Servidor los envía a través de excepciones. Las hay de dos tipos:
- Internas del Firebird (por ejemplo, si quieres consultar una tabla que no existe, o insertar un valor nulo en una columna que no acepta nulos, etc., etc.)
- Propias del usuario (por ejemplo, si la fecha de la cobranza es anterior a la fecha de la venta, si se calificó a un alumno antes de que se inscribiera, etc., etc.)
En Visual FoxPro puedes atrapar esos errores (o excepciones) usando la función AERROR()
Y siempre deberías avisarles a los usuarios que falló el bloqueo y que por eso realizaste un ROLLBACK. Y además grabar todos esos errores en un archivo de log para que puedas consultarlos más tarde y descubrir y corregir los inconvenientes.
Saludos.
Walter.