Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Migracion DBE a FIREDAC (https://www.clubdelphi.com/foros/showthread.php?t=87864)

Esmeralda Ramos 10-03-2015 21:35:12

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

nlsgarcia 10-03-2015 22:31:43

Esmeralda Ramos,

¡Bienvenida al Club Delphi! :D

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.

Al González 10-03-2015 22:56:01

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.

Esmeralda Ramos 11-03-2015 00:30:05

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.

Esmeralda Ramos 11-03-2015 02:08:46

1 Archivos Adjunto(s)
Este es el tipo de bloqueo que se me presentan en el sistema con versión firedac lo que no sucedia con el bde.

AgustinOrtu 11-03-2015 03:00:38

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 :D

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? :D

Esmeralda Ramos 11-03-2015 17:15:08

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

Esmeralda Ramos 11-03-2015 17:18:16

1 Archivos Adjunto(s)
Perdonen aqui esta el .zip
Una disculpa

Esmeralda Ramos 07-04-2015 00:48:39

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

AgustinOrtu 07-04-2015 01:38:15

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

Esmeralda Ramos 12-05-2015 01:19:09

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.


La franja horaria es GMT +2. Ahora son las 23:38:56.

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