Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Manejo de transacciones en SQL server (https://www.clubdelphi.com/foros/showthread.php?t=59082)

look 12-08-2008 16:51:55

Manejo de transacciones en SQL server
 
Hola Amigos y compañeros del foro tengo el siguiente problema y me aboco a ustedes para ver si es posible resolverlo:

-Tengo un sistema de facturación hecho en delphi 7 con una base de datos en SQL Server, instale mi sistema en aproximadamente 13 PCs, de las cuales solo 5 son de los facturadores ,el problema que tengo es que el sistema se me cuelga al momento de grabar una factura ,lo que es extraño porq cuando empezaron a usar el sistema , este no se colgaba, creo que el problema viene por el manejo de las transacciones, para el evento de grabar utilizo :

Código Delphi [-]
  if not (form1.Database1.InTransaction) then form1.Database1.StartTransaction;
   try
   
  //  proceso en el que preparo los datos antes de ser guardados
    q_cab.SQL.text....
 // ejecucion de Querys

form1.Database1.Commit;
except
on E: Exception do
  begin
        Application.MessageBox( PChar( E.Message ), 'Ocurrio un Error en el posteo,intente de nuevo',
        MB_ICONSTOP );
        form1.database1.rollback;
  end;

el momento en el que se cuelga es normalmente cuando guardan al mismo tiempo una factura, el if not (form1.Database1.InTransaction) then , probablemente este generando el problema ya que si una maquina esta en proceso de grabado las demás tienen que esperar a que esta termine ,a esto súmenle una maquina no muy rápida que digamos , luego otras transacciones pendientes, por la de los facturadores ,se genera una lentitud extrema , básicamente lo que quiero es que el programa no dependa de que si otra maquina esta es transacción, esta pueda grabar en la base sin ningún problema, ya que si se cuelga en el momento de grabar la factura se empiezan a colgar una a una hasta que la primera que empezó a grabar termine el proceso. :(.....
¿Cual sera la mejor forma de guardar la informacion?
espero me ayuden a encontrar una solución...:)

luisgutierrezb 12-08-2008 16:58:30

A mi hace tiempo me dieron un consejo que me ha resultado muy bueno, las transacciones son solo al momento de guardar datos, con esto quiero decir que para que iniciar una transaccion por ejemplo al inicio de la pantalla, si lo unico que haces es bloquear todo, solo usa la transaccion al momento en que empiezes a guardar o modificar datos y cuando termines finalizala

poliburro 12-08-2008 20:04:58

lo mejor es que coloques las transacciones en Sql server.

Pues almacenar la información de facturación en un Xml, enviarla al servidor convertirla a un recorset y guardar los datos en un bloque transaccional con su respectivo manejo de errores.

Colocar las transacciones en los clientes es una mala práctica.

look 12-08-2008 20:56:40

Cita:

Empezado por poliburro (Mensaje 307185)
lo mejor es que coloques las transacciones en Sql server.

Pues almacenar la información de facturación en un Xml, enviarla al servidor convertirla a un recorset y guardar los datos en un bloque transaccional con su respectivo manejo de errores.

Colocar las transacciones en los clientes es una mala práctica.

hola , gracias por responder ,¿podrias mostrarme un ejemplo?...

ContraVeneno 12-08-2008 23:12:32

Pues por lo pronto yo veo un error bastante común (al menos lo he visto es muchos programas).

En tu código al ocurrir una excepción, muestras el mensaje de error y después haces el rollback.

Ahora imagina al clásico usuario al cuál le dan ñañaras las computadoas:

- "ok, hoy si voy a trabajar.. vamos a ver.. crear factura.. capturar... ¡CHANGOS!, esta mugre ya marcó un error...."
Se levanta de su silla, se va a preparar un café, platica con la secretaría, luego va con el guardia a platicar de futbol y después de todo eso va con el de sistemas a reportarle el error.

Durante todo ese tiempo, como nunca le dio aceptar al error, la transacción siguió activa, bloqueando a todos los demás usuarios.

Solución: Ejecuta el RollBack primero y después muestra el error.

Como sugerencia, trataría de hacer las excepciones más específicas y no utilizar el E:Exception, si no la clase del error que estoy esperando, EDBEngine por ejemplo. Y cambiaría el mensaje por: 'Ocurrió un error al intentar guardar. ' +#13+E.ClassName+' - '+E.Message Pero es cosa personal, eso de decir "posteo" no me gusta a mi para nada...

look 12-08-2008 23:32:58

Cita:

Empezado por ContraVeneno (Mensaje 307272)
Pues por lo pronto yo veo un error bastante común (al menos lo he visto es muchos programas).

En tu código al ocurrir una excepción, muestras el mensaje de error y después haces el rollback.

Ahora imagina al clásico usuario al cuál le dan ñañaras las computadoas:

- "ok, hoy si voy a trabajar.. vamos a ver.. crear factura.. capturar... ¡CHANGOS!, esta mugre ya marcó un error...."
Se levanta de su silla, se va a preparar un café, platica con la secretaría, luego va con el guardia a platicar de futbol y después de todo eso va con el de sistemas a reportarle el error.

Durante todo ese tiempo, como nunca le dio aceptar al error, la transacción siguió activa, bloqueando a todos los demás usuarios.

Solución: Ejecuta el RollBack primero y después muestra el error.

Como sugerencia, trataría de hacer las excepciones más específicas y no utilizar el E:Exception, si no la clase del error que estoy esperando, EDBEngine por ejemplo. Y cambiaría el mensaje por: 'Ocurrió un error al intentar guardar. ' +#13+E.ClassName+' - '+E.Message Pero es cosa personal, eso de decir "posteo" no me gusta a mi para nada...

Gracias por responder amigo ContraVeneno, efectivamente ,estoy deacuerdo con todo le me explicas aqui, esos puntos ya los habia resuelto segun lo que me dices ,lo de Rollback y todo lo demas , esque puse el codigo al vuelo :p, y lo de Posteo , pos igual no se me ocurrio otra palabra en el momento ... nuevamente gracias por responder :)

poliburro 21-08-2008 17:27:17

Cita:

Empezado por ContraVeneno (Mensaje 307272)


Durante todo ese tiempo, como nunca le dio aceptar al error, la transacción siguió activa, bloqueando a todos los demás usuarios.


Excelente ejemplo amigo contra, Esa es la gran razón por la que es una malisima práctica colocar las transacciones en los clientes.

a eso agregale que el programa se bloquea antes de lanzar el rollback.

las transacciones deben ser controladas por el manejador de bd


La franja horaria es GMT +2. Ahora son las 11:54:57.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi