PDA

Ver la Versión Completa : Error con las transacciones


weke
11-04-2008, 10:30:36
Buenos días a todos/as,
estoy teniendo problemas con las transacciones (o eso es lo que parece en un principio) que me genera una serie de errores en el sistema. A continuación explico la situación por si estuviera haciendo alguna cosa mal y me pueden ayudar a solucionarlo (o a alguien le ha pasado lo mismo alguna vez).

Utilizo Delphi 7 y tengo 3 bases de datos en Firebird y a las 3 accedo de la misma forma, con un TIBDatabase y un TIBTransaction. En el TIBTransaction tengo las propiedades "read_committed, rec_version, nowait".
La cuestión es que en algunos procesos inserto registro en 2 o 3 tablas diferentes, haciendo un Transaction.CommitRetaining después de ejecutar la consulta (INSERT o UPDATE). Pues en principio todo funciona correctamente pero al tiempo de utilizar la aplicación da error al hacer cualquier operación y hay que cerrar la aplicación y volver a abrirla y funciona correctamente de nuevo.
He probado a poner un Transaction.CommitRetaining y Transaction.Commit después de hacer todas las operaciones (al volver a la pantalla principal de la aplicación) pero sigo con el mismo problema.

Es decir, que no se si es por las transacciones que se quedan abiertas y cuando voy a hacer otro INSERT o UPDATE me da error o es por otro motivo. Si no me he sabido explicar muy bien pero bueno.

Muchas gracias de antemano y un saludo,

duilioisola
11-04-2008, 11:00:48
al tiempo de utilizar la aplicación da error

¿Qué error?
Si es Deadlock, puede que sea de transacciones.

Hay más de una conexión a cada base de datos o solo tienes un ejecutable funcionando?

Si haces Commit o CommitRetaining después de cada insert/update/delete, es difícil que tengas errores de transacción. (A menos que haya más de una aplicación accediendo a la base de datos)

weke
11-04-2008, 11:28:50
La aplicación se ejecuta en varios ordenadores a la vez. Y el error que da no se el porque, las consultas las tengo en un try y en el except muestro un formulario que he hecho yo para mostrar mensajes.

duilioisola
11-04-2008, 11:42:12
Cita:
al tiempo de utilizar la aplicación da error
¿Qué error?

Me refiero al mensaje de error. Al texto del error.
En el bloque try ... except haz lo siguiente para ver el texto del error:

...
{ejecutar insert/update/delete}
with Q do
begin
try
if not Transaction.InTransaction then Transaction.StartTransaction;
...
ExcecQuery;
Transaction.CommitRetaining;
except
on e:exception do : ShowMessage('Error al ejecutar insert/update/delete. '+#13+e.Message);
end;
...

weke
11-04-2008, 13:43:14
Muchas gracias, voy a probarlo y en cuanto sepa algo ya lo comunico a ver que tal.

weke
11-04-2008, 18:01:15
He probado lo que me dijiste pero no he podido ver el error porque es una aplicación que está en fábrica y no estoy todo el día encima para poder verlo, pero me ha dado errores al hacer consultas simples (SELECT * FROM X). No se si tendría que poner algo antes de realizar estas consultas para evitar este error (comprobar que no haya ninguna transacción abierta o algo así).

Seguiré investigando cosas a ver si puedo ver el error exacto que me da en el TRY para ponerlo aquí.

duilioisola
12-04-2008, 02:16:27
Podrías guardar el texto del error en un fichero.
Deberías guardar la fecha y hora, el texto del error y quizás alguna otra información, como el sql que ha generado el error o los parámetros que le has puesto.
Puede ser que le envíes parametros fuera de ranco o que si construyes el where te quede algo mal.

Por ejemplo
var
s:string;
begin
s := 'select campo from tabla where id='+edit1.text;
...

Si edit1.text es vacío, el sql será select campo from tabla where id= y dirá que la sentencia SQL está incompleta o algo asi