Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-03-2015
Esmeralda Ramos Esmeralda Ramos is offline
Registrado
NULL
 
Registrado: mar 2015
Posts: 9
Poder: 0
Esmeralda Ramos Va por buen camino
Migracion DBE a FIREDAC

Hola chicos con el gusto de saludarles antes que nada este foro es buenisimo.
Me ha sacado de muchas dudas.
Recientemente he migrado una version de Delphi 7 a XE4
con ello migre al componente de FIREDAC para la conexion a la base de datos en SQL
sin embargo me sucede lo siguiente
Si un usuario a esta utilizando una tabla por ejemplo OficiosPagoDetalle esta insertando y/o eliminando registros
y otro usuario b intenta realizar un insert en la misma tabla se me genera el siguiente problema
la accion b no puede terminar hasta que a termine lo cual me parece totalmente ilogico
ami connection ya le puse la propiedad xiDirtyRead, no se que otra propiedad me haga falta configurar les agradeceria su apoyo
ya que me esta generando muchos problemas.

Gracias
Responder Con Cita
  #2  
Antiguo 10-03-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Esmeralda Ramos,

¡Bienvenida al Club Delphi!

Te sugiero revisar la Guía de estilo de los foros, recomendada a todos los nuevos ingresos al Club Delphi.

¡Gracias por tu cooperación!

Saludos,

Nelson.
Responder Con Cita
  #3  
Antiguo 10-03-2015
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Hola Esmeralda.

Intenta usar el nivel de aislamiento (propiedad Isolation) xiReadCommitted, en lugar de xiDirtyRead. Aquí puedes ver el significado de las distintas opciones: http://docwiki.embarcadero.com/Libra...ions.Isolation

Por cierto, mencionas que usas un motor SQL, enhorabuena. Pero ¿es Firebird, Oracle, MS SQL Server...? El primero de ellos es uno de los más recomendables para trabajar con Delphi y muy bueno en general.

Por otro lado, toma muy en cuenta la recomendación de Nelson.

Saludos.
Responder Con Cita
  #4  
Antiguo 11-03-2015
Esmeralda Ramos Esmeralda Ramos is offline
Registrado
NULL
 
Registrado: mar 2015
Posts: 9
Poder: 0
Esmeralda Ramos Va por buen camino
Nelson gracias por el aporte.
Actualmente utilizo sql server 2005. No he estudiado Firebird pero me pondré a estudiar el tema.
Voy a intentar con propiedad Isolation xiReadCommitted y liberar versión del sistema. Mañana platico cuales fueron los resultados.
Realmente me intriga el tema por que no me habia sucedido y además me genera bloqueos en el sistema.
Responder Con Cita
  #5  
Antiguo 11-03-2015
Esmeralda Ramos Esmeralda Ramos is offline
Registrado
NULL
 
Registrado: mar 2015
Posts: 9
Poder: 0
Esmeralda Ramos Va por buen camino
Este es el tipo de bloqueo que se me presentan en el sistema con versión firedac lo que no sucedia con el bde.
Imágenes Adjuntas
Tipo de Archivo: jpg Bloqueo.jpg (6,1 KB, 24 visitas)
Responder Con Cita
  #6  
Antiguo 11-03-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
La imagen es muy chica y no se ve nada :P

Inicias transacciones y las cerras debidamente? Podrias mostrar la parte en que abris y cerras las transacciones?

Lo digo porque un compañero tenia un "problema" similar al tuyo y decia que todo era una "m..." y hacia algo como esto

Código Delphi [-]
procedure TForm1.Button1Click..
begin
  IniciarTransaccion;
end;

procedure TForm1.Button2Click..
begin
  try
    with Tabla_Clientes do
    begin
      FieldByName('Nombre').AsString := EditNombre.Text;
      FieldByName('Apellido').AsString := EditApellido.Text;
    end;
      Commit;
    except
       Rollback;
   end;
end;

Una transaccion de insercion o borrado de registro deberia llevar unos cuantos milisegundos, a no ser que dispares millones de triggers, no deberia pasarte lo de A bloquea a B

Pero ahora en el codigo que yo puse antes, el tipo iniciaba la transaccion con un boton, y la cerraba con otro. Que pasa si tocan el button1 y se van a tomar su cafecito?
Responder Con Cita
  #7  
Antiguo 11-03-2015
Esmeralda Ramos Esmeralda Ramos is offline
Registrado
NULL
 
Registrado: mar 2015
Posts: 9
Poder: 0
Esmeralda Ramos Va por buen camino
Si perdon adjunto la imagen en un .zip, cambie insolation a xiReadCommitted pero esta mañana me presento el mismo problema.
Lo que note es que Cuando un usuario a esta modificando una Orden de Pago se realizan una serie de select para que puedan elegir los datos por ejemplo el tipo de impuesto.
Y si en ese mismo instante otro usuario b esta intentando eliminar un registro de una orden de pago es bloqueado por el usuario "a" hasta que este termina.
las transacciones las realizo de la siguiente manera y estan en un mismo evento en el boton aceptar:
Código Delphi [-]
procedure TfrmOrdenPagoEdicion.BitBtn3Click(Sender: TObject);
begin
try
    dmModulo.CNDHBD.StartTransaction;

    qryActualiza:=Tadquery.Create(self);
    qryActualiza.Connection:= dmModulo.CNDHBD;


    qryActualiza.close;
    qryActualiza.sql.text:=' Delete from OrdenPagoPresupuesto where AñoOrdenPago = :Ao and OrdenPago = :OP and documento = :documento '+
                           '  and UnidadResponsable = :UR '+
                           '  and AñoEstructuraProgramatica = :AOE and EstructuraProgramatica = :EP and Area = :Area and '+
                           ' ClavePresupuestal = :CP and Mes = :Mes ';
     qryActualiza.parambyname('AO').asinteger:= strtoint(vgAoOP);
     qryActualiza.parambyname('OP').asinteger:= strtoint(vgOP);
     qryActualiza.parambyname('Documento').asinteger:= qryOrdenPagoPresupuesto.fieldbyname('Documento').asinteger;
     qryActualiza.parambyname('UR').asinteger:= qryOrdenPagoPresupuesto.fieldbyname('UnidadResponsable').asinteger;
     qryActualiza.parambyname('AOE').asinteger:= qryOrdenPagoPresupuesto.fieldbyname('AñoEstructuraProgramatica').asinteger;
     qryActualiza.parambyname('EP').asinteger:= qryOrdenPagoPresupuesto.fieldbyname('EstructuraProgramatica').asinteger;
     qryActualiza.parambyname('Area').asinteger:= qryOrdenPagoPresupuesto.fieldbyname('Area').asinteger;
     qryActualiza.parambyname('CP').asinteger:= qryOrdenPagoPresupuesto.fieldbyname('ClavePresupuestal').asinteger;
     qryActualiza.parambyname('Mes').asinteger:= qryOrdenPagoPresupuesto.fieldbyname('Mes').asinteger;

     qryActualiza.ExecSQL;

    dmModulo.CNDHBD.Commit;

except
       dmModulo.CNDHBD.Rollback;
       raise;
 end;
end.
Esta falla se presento desde que cambie el engine por firedac.
Muchas gracias por la ayuda

Última edición por nlsgarcia fecha: 11-03-2015 a las 18:27:31. Razón: Sintaxis Delphi
Responder Con Cita
  #8  
Antiguo 11-03-2015
Esmeralda Ramos Esmeralda Ramos is offline
Registrado
NULL
 
Registrado: mar 2015
Posts: 9
Poder: 0
Esmeralda Ramos Va por buen camino
Perdonen aqui esta el .zip
Una disculpa
Archivos Adjuntos
Tipo de Archivo: zip Bloqueo.zip (14,6 KB, 8 visitas)
Responder Con Cita
  #9  
Antiguo 07-04-2015
Esmeralda Ramos Esmeralda Ramos is offline
Registrado
NULL
 
Registrado: mar 2015
Posts: 9
Poder: 0
Esmeralda Ramos Va por buen camino
Buena tarde.

He estado realizando pruebas y finalmente encontre lo que sucede sin embargo no he podido darle solución.
Sucede que si un usuario deja de usar la aplicación, la deja abierta y enseguida deja de usar
totalmente el equipo de computo durante un tiempo que oscila entre los 5 minutos y 30 minutos
comienzan los bloqueos
hasta que este usuario que dejo de usar el equipo de computo regresa al mismo y cierra la aplicación los demás de desbloquean.
Implemente un Timmer para cerrar la aplicación si dejan de usarlo mas 5 minutos pero no ha funcionado en ciertas maquinas no funciona y los bloqueos siguen
Puse 30000 por que no funcionaba con los 300000 que en teoria le corresponden al timmer.
Código Delphi [-]
procedure TfrmPrincipal.ApplicationEvents1Idle(Sender: TObject;
  var Done: Boolean);
begin
StartTime := GetTickCount();
Done := TRUE;
end;

procedure TfrmPrincipal.Timer2Timer(Sender: TObject);
var FinalTime  : Cardinal;
begin
  if (dmModulo._UsuarioUR > 0) then
  begin
  FinalTime:= GetTickCount();
   if FinalTime - StartTime > 30000 then
      Application.Terminate;
  end;
end;
Agradecere su apoyo.
Nuevamente GRacias

Última edición por nlsgarcia fecha: 07-04-2015 a las 02:07:43. Razón: Sintaxis Delphi
Responder Con Cita
  #10  
Antiguo 07-04-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Eso que quieres hacer es un "Hack", es decir, "soluciona" tu problema pero no atacas la raiz del problema

La unica forma que yo conozca que haya bloqueos en la base de datos es alguna transaccion que este abierta y no se haya cerrado

Yo tambien utilizo SQL Server 2005 y jamas me paso algo asi. El unico caso que vi era un sistema que habia hecho un amigo en el cual manejaba los ciclos de apertura/cierre de transacciones mediante eventos controlados por el usuario, por ejemplo cuando cargaba una factura, al iniciar el form de carga de factura iniciaba una transaccion. Si este se iba y dejaba el sistema ahi, estaban todos bloqueados hasta que vuelva de tomar su cafe

Código Delphi [-]
const
    CONNECTION_STRING           = 'Provider=SQLOLEDB.1;Persist Security Info=True; ' +
                                  'Initial Catalog=%s;Data Source=local\SQLEXPRESS;' +
                                  'Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;' +
                                  'Use Encryption for Data=False;Tag with column collation when possible=False';

Esta es la connection string que utilizo en ADO para conectar a SQL Server 2005 desde Delphi 2010. Tambien funciona para SQL Server 2008 R2 sin problemas

No habra alguna transaccion explicita que se haya iniciado sin que te des cuenta?

Prueba a poner un valor menor al que tengas en la propiedades CommandTimeout y ConnectionTimeout de la ADOConnection
Responder Con Cita
  #11  
Antiguo 12-05-2015
Esmeralda Ramos Esmeralda Ramos is offline
Registrado
NULL
 
Registrado: mar 2015
Posts: 9
Poder: 0
Esmeralda Ramos Va por buen camino
AgustinOrtu muchas gracias por la ayuda como bien decias por la desesperación solo lo solucione temporalmente y me puse seriamente a pensar en tus post.He debugueado el codigo pasa por paso he tardado mucho tiempo pero tenías razón por ahí esta un transaction abierto y jamas se cerraba.
Yo lo he cerrado y los bloqueos han desaparecido.
Agradezco mucho la ayuda.
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
Uso de Firedac jafera Conexión con bases de datos 2 12-11-2014 13:46:25
Problema con FireDac darkamerico Conexión con bases de datos 2 04-11-2014 15:05:16
Migracion BDE a FireDac rodker Varios 3 23-07-2014 21:55:17
FireDac y Access glsaavedra Conexión con bases de datos 2 28-05-2014 00:09:15
Firedac Aldo Conexión con bases de datos 2 16-12-2013 23:26:07


La franja horaria es GMT +2. Ahora son las 02:39:05.


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