Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-08-2008
Avatar de look
look look is offline
Miembro
 
Registrado: sep 2007
Ubicación: The Shire
Posts: 656
Poder: 17
look Va camino a la fama
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...
__________________
all your base are belong to us
Responder Con Cita
  #2  
Antiguo 12-08-2008
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 12-08-2008
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
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.
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #4  
Antiguo 12-08-2008
Avatar de look
look look is offline
Miembro
 
Registrado: sep 2007
Ubicación: The Shire
Posts: 656
Poder: 17
look Va camino a la fama
Cita:
Empezado por poliburro Ver Mensaje
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?...
__________________
all your base are belong to us
Responder Con Cita
  #5  
Antiguo 12-08-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
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...
__________________


Última edición por ContraVeneno fecha: 12-08-2008 a las 23:17:49.
Responder Con Cita
  #6  
Antiguo 12-08-2008
Avatar de look
look look is offline
Miembro
 
Registrado: sep 2007
Ubicación: The Shire
Posts: 656
Poder: 17
look Va camino a la fama
Cita:
Empezado por ContraVeneno Ver Mensaje
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 , y lo de Posteo , pos igual no se me ocurrio otra palabra en el momento ... nuevamente gracias por responder
__________________
all your base are belong to us
Responder Con Cita
  #7  
Antiguo 21-08-2008
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
Cita:
Empezado por ContraVeneno Ver Mensaje


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
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Manejo de transacciones StartKill MS SQL Server 7 23-09-2008 21:46:53
error en manejo de transacciones JODELSA Varios 1 11-07-2005 16:50:56
Como manejo varias Transacciones a la vez con Access marcoev Tablas planas 2 25-04-2005 21:44:28
Manejo de Transacciones takeo Conexión con bases de datos 0 01-12-2004 05:29:53
Manejo de Transacciones senpiterno Conexión con bases de datos 1 08-10-2004 15:05:34


La franja horaria es GMT +2. Ahora son las 21:15:58.


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
Copyright 1996-2007 Club Delphi