Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
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 07-10-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 26
maeyanes Va por buen camino
Lo que sucede es que en realidad tengo creado un tipo de framework para trabajar con objetos en lugar de registros...

Entonces, en lugar de hacer DataSet.Post, en realidad hago algo como Objeto.Store, entonces, internamente el método mencionado hace el manejo de las transacciones...

Ahora, cuando quiero manejar inserciones masivas, vamos a decirle así, por ejemplo tipo master-detail, lo que hago es iniciar una transacción, realizar el ciclo de inserciones (Objeto.Store) y al final el Commit o Rollback dependiendo de si todo estuvo bien u ocurrió un error.

Mi código es más o menos ásí:

Código Delphi [-]
var
  Objeto: TObjetoFrameWork;

begin
  Connection.StartTransaction;
  try
    for I := 0 to ListaObjetos.Count - 1 do // ListaObjetos es un TList
    begin
      Objeto := TObjetoFrameWork(ListaObjetos[i]);
      repeat
        Stored := True;
        try
          Objeto.Store
        except
          on E: EIBInterBaseError do
          begin
            // Si existe DeadLock, cambio a False Stored para repetir la inserción...
            Stored := not E.SQLCode = -901; 
            if Stored then // Si Stored sigue siendo verdadero, la excepción fue otra y la relanzo...
              raise
          end
        end
      until
        Stored
    end;
    Connection.CommitTransaction
  except
    Connection.RollbackTransaction
  end
end;

Espero que con esto te aclare mejor las cosas...



Saludos...
Responder Con Cita
  #2  
Antiguo 10-10-2006
ronalg ronalg is offline
Miembro
 
Registrado: may 2003
Ubicación: Sucre - Bolivia
Posts: 68
Poder: 24
ronalg Va por buen camino
Guardar lo que pides hasta que lo necesites

bueno no se si te servira, yo uso generadores, pero el cliente pide un numero, y lo guardo en el registro de windows, hasta que lo necesito, una simple variable de cod_factura en el regitro, si esta variable es vacia pido un nuevo numero al generador, si esta llena uso ese valos, si hay error no vacio la variable y si no lo hay la vacio y asi garantizo que aunque se corte la luz como esta en el registro de windows puedo rescatar el número que pedí.

Espero que te sirva
__________________
Saludos desde Sucre - Bolivia
"Si te lo puedes imaginar lo
puedes resolver" Pyriel
Responder Con Cita
  #3  
Antiguo 16-10-2008
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.420
Poder: 24
AGAG4 Va por buen camino
Vuelvo a reabrir este hilo que hace más de 2 años lo abri, sigo con este problema de los bloqueos pesimistas, no me funciona el parametro DeadlockTimeout dentro de firebird.conf, no mata los bloqueos que duran el tiempo que especifico, lo que ha de esperar firebird es que ocurra un problema en el bloqueo pero no especifica que problemas considera para activar el DeadlockTimeout, espero a alguien haya encontrado algo para RE-matar un bloqueo muerto ....

Código:
DeadlockTimeout = Número de segundos (entero) que el gestor de bloqueos 
esperará despues de la aparición de un conflicto antes de purgar todos los 
bloqueos de procesos muertos y realizar un ciclo posterior de detección de 
deadlocks. Normalmente el motor detecta instantáneamente los deadlocks. 
El timeout de deadlocks solo se dispara cuando algo va mal.El valor 
por defecto de 10 segundos es adecuado para la mayoría de las situaciones. 
Configurar un valor menos no aumenta necesariamente la velocidad a la que 
los deadlocks problemáticos devuelven una excepción de conflicto. Si es 
demasiado bajo, el efecto puede ser escaneos extra innecesarios que 
degraden el rendimiento del sistema.
__________________
"Hemos aprendido a volar como los Pájaros, y a nadar como los Peces, y todavía No aprendemos a vivir como Hermanos". Martin Luther King

Última edición por AGAG4 fecha: 16-10-2008 a las 17:58:43. Razón: Corrección
Responder Con Cita
  #4  
Antiguo 16-10-2008
Avatar de RolphyReyes
RolphyReyes RolphyReyes is offline
Miembro
 
Registrado: ago 2004
Ubicación: Santo Domingo
Posts: 285
Poder: 23
RolphyReyes Va por buen camino
Lightbulb Idea

Saludos.

No se si migraste o podrías migrar a FB >= 2.

En esta versión existe la clausula LOCK TIMEOUT.

Cita:
Lock Timeout for WAIT Transactions
A. Karyakin, D. Yemanov
All Firebird versions provide two transaction wait modes: NO WAIT and WAIT. NO WAIT mode means that
lock conflicts and deadlocks are reported immediately, while WAIT performs a blocking wait which times out
only when the conflicting concurrent transaction ends by being committed or rolled back.
The new feature extends the WAIT mode by making provision to set a finite time interval to wait for the concurrent
transactions. If the timeout has passed, an error (isc_lock_timeout) is reported.
Timeout intervals are specified per transaction, using the new TPB constant isc_tpb_lock_timeout in the API or,
in DSQL, the LOCK TIMEOUT <value> clause of the SET TRANSACTION statement.
Y también:
Cita:
Lock Timeout for WAIT Transactions
A. Karyakin, D. Yemanov
The new feature extends the WAIT mode by making provision to set a finite time interval to wait for the concurrent
transactions. If the timeout has passed, an error (isc_lock_timeout) is reported.
Timeout intervals can now be specified per transaction, using the new TPB constant isc_tpb_lock_timeout in
the API.
Note
The DSQL equivalent is implemented via the LOCK TIMEOUT <value> clause of the SET TRANSACTION
Un ejemplo:
Cita:
SET TRANSACTION WAIT SNAPSHOT NO AUTO UNDO LOCK TIMEOUT 10
Extraído de Firebird 2.0.1 Release Notes.

Hasta luego.
__________________
Gracias,
Rolphy Reyes
Responder Con Cita
  #5  
Antiguo 16-10-2008
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.420
Poder: 24
AGAG4 Va por buen camino
Te agradezco la sugerencia, ya lo habia pensado, en este momento estoy en la version 1.5.5 tengo que hacer varios cambios en los trigger's para cambiarme a la version 2.0, cosa que estoy evaluando.... por el momento estoy investigando si en la versión 1.5.5. se puede hacer algo similar....
__________________
"Hemos aprendido a volar como los Pájaros, y a nadar como los Peces, y todavía No aprendemos a vivir como Hermanos". Martin Luther King
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
Como darle información a mi base de Datos servicomp Firebird e Interbase 3 01-08-2006 18:56:22
como darle nuevos aspectos a un trackbar de delphi rls Varios 2 16-11-2005 21:26:31
Como darle color a un TListColumn? abracadabra OOP 4 15-07-2005 17:01:40
Tips: Como darle velocidad al IDE en D8 mamcx .NET 0 30-09-2004 18:09:45
Darle Vida a una IbQuery Rabata Conexión con bases de datos 6 16-09-2003 18:48:23


La franja horaria es GMT +2. Ahora son las 16:45:17.


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