PDA

Ver la Versión Completa : Problemas con Bloqueos en IBX


AGAG4
14-01-2006, 19:40:58
Uso CachedUpdate en los ibDataset's
En Parámetros del ibTransaction tengo lo siguiente:

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:

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

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