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)
-   -   Problemas con Bloqueos en IBX (https://www.clubdelphi.com/foros/showthread.php?t=29185)

AGAG4 14-01-2006 19:40:58

Problemas con Bloqueos en IBX
 
Uso CachedUpdate en los ibDataset's
En Parámetros del ibTransaction tengo lo siguiente:
Código Delphi [-]
  read_committed
  rec_version
  nowait

Tengo una Tabla de Consecutivos de Folios donde llevo el control, pongo un ejemplo:
DOCUM SERIE FOLIOFISCAL
FACT FM 344488 /*FACTURAS*/
FACT PM 5509 /*COTIZACIONES*/
FACT RM 24456 /*REMISIONES*/

Tengo 1 problema que me tiene muy preocupado ya hace varios meses atras con mi Aplicación de Facturación, el problema que tengo es que si mandan a Guardar Facturas más de 2 Clientes, alguno de estos clientes solo Imprime la Factura pero no la guarda. Pongo el Siguiente ejemplo de la forma que lo implemento al momento de Guardar una Factura:
Código Delphi [-]
  // Tomar último FOLIOFISCAL de Factura en Tabla de Consecutivos
  while true do
    try
      FolioFinal:=0;
      {Procedimiento Almacenado para Tomar Último Folio y al 
       Regresarlo Aumenta dicho Folio en la Tabla Consecutivos, 
       AQUI SE PRODUCE EL BLOQUEO AL REGISTRO, POR LO TANTO 
       SI HUBIESE OTRO CLIENTE QUE GUARDE FACTURA 
       AQUI SE QUEDA DANDO VUELTAS HASTA QUE SE DESBLOQUEE}
       FolioFinal:=DameFolioFiscal
       ('GRABA_FOLFISCAL','DOCUM','SERIE','FACT',Serie,'FOLIOFISCAL');
       Maestro.FieldByName('FOLIOFISCAL').value:=FolioFinal;
       //Asegurar Folio
       if FolioFinal > 0 then
         break;
     except
       {Damos 5 Segundos para que se desbloquee, 
         en caso de que siga  bloqueado, damos otra pasada, 
         es decir sigue el ciclo hasta que se Desbloquee}
       Sleep(5000);
     end;
     
     //Imprimimos Factura
     Imprimir;
 
     //Grabamos Cambios y Aceptamos Transacción
     try
       if Detalle.UpdatesPending then
         Detalle.ApplyUpdates;
       if Maestro.UpdatesPending then
         Maestro.ApplyUpdates;
       //Aceptar Transacción
       Transaccion.CommitRetaining;
     except
       on E:Exception do
         //Mostramos Error
         MensajesW(PChar(e.message),'Error al Guardar',MB_ICONERROR);
     end;
El Problema de que sólo Imprime la Factura y NO la GUARDA es que al llegar a Aplicar los Cambios con ApplyUpdate es donde se produce el siguiente error:

lock conflict on no wait transaction
deadlock
update conflicts with concurrent update


Este ERROR indica que 2 ó más Clientes quieren accesar al mismo registro es por eso que se produce este error pero lo que no me Explico es que Porque Diablos lo marca porque supuestamente ARRIBA ya dejo Bloqueado el Registro, ya hice pruebas Compilando la Aplicación paso por paso(F8) en 2 PC's con DELPHI(Compilando cada una al mismo tiempo) y una tercera PC sin Delphi tomando el papel de un cliente normal, y realize pruebas TODO el día Accesando al mismo tiempo cuando toman el FolioFiscal, pero Todo funcionó a la Perfección, Siempre llegaba 1 CLIENTE a Bloquear dicho registro y las demás se esperaba a que se desocupará, se desbloqueaba el registro y otro cliente lo bloqueaba y asi sucesivamente.

Espero que a alguien le haya pasado lo mismo, y ojala me pudieran ayudar con este problema que me tiene SuperEnbroncado con el programa.

Que tengan buen día.

AGAG4 14-01-2006 20:56:43

????
 
Le aplique una pequeña prueba al IBDatabase después de haberse conectado y haber iniciado Transacción el IBTransaction:
Código Delphi [-]
showmessage( BoolToStr(IbBD.HandleIsShared));

Me regreso 0 indicando que es FALSE, será este el motivo????
El Problema es que HandleIsShared es de sólo LECTURA


La franja horaria es GMT +2. Ahora son las 18:42:18.

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