Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-05-2005
RESP 3.0 RESP 3.0 is offline
Miembro
 
Registrado: may 2005
Posts: 29
Poder: 0
RESP 3.0 Va por buen camino
Problemilla con transacciones e IBDataSet

Que tal señores les planteo mi situacion:

Utilizo D6 IBX FB 1.5.2

Tengo un IBDataset el cual tiene un campo que sufre modificaciones dentro de un SP, el problema que tengo es:

Abro la IBDataset y pongo en modo de edicion un registro (simulando que se esta modificando) y en otra instancia de la aplicacion se ejecuta el SP que modifica el campo calculado del IBDataset, el problema es que cuando Posteo el IBDataset no considera los cambios realizados desde la otra transaccion (otro cliente), como puedo hacer o cual es el nivel de aislamiento a utilizar, actualmente utilizo read_committed y wait en todas mis transacciones.

De antemano, gracias por la ayuda
Responder Con Cita
  #2  
Antiguo 28-05-2005
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.420
Poder: 21
AGAG4 Va por buen camino
checa esto....

Ya usastes un Commit ó CommitRetaining del componente ibTransaction ????

Saludos.
Responder Con Cita
  #3  
Antiguo 30-05-2005
RESP 3.0 RESP 3.0 is offline
Miembro
 
Registrado: may 2005
Posts: 29
Poder: 0
RESP 3.0 Va por buen camino
Primero que todo, gracias por la atencion, fijate que si siempre utilizo ambas dependiendo de la situacion, el problema en si es como hago para bloquear un registro desde las IBX?, por ejemplo cuando lo coloquen en modo de edicion que automaticamente se bloquee.
Responder Con Cita
  #4  
Antiguo 30-05-2005
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.420
Poder: 21
AGAG4 Va por buen camino
checa esto....

En el tipo de aislamiento de la Transacción puedes cambiarle de nowait a wait, presiona el boton derecho del ratón sobre el componente ibTransaction y entra a Transaction Editor y en el aislamiento Read Commited viene lo que te digo....

Esto significa que cuando 2 PC's esten usando 1 mismo registro una de ellas tiene que esperar a que desocupe este mismo registro.

Saludos.
Responder Con Cita
  #5  
Antiguo 31-05-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Firebird usa un modelo de bloqueos "optimista", por lo que un registro no será bloqueado con el simple hecho de comenzar su edición.

Podes simular un entorno de bloqueos "pesimista" haciendo lo que se conoce como una actualización en falso sobre el registro que te interesa, de manera que este sea efectivamente bloqueado.

Podrias, en el evento AfterEdit, por ejemplo, lanzar el siguiente query:

Código SQL [-]
  Update Tabla
    set campo = campo
  where llave = ValorLlave;

como ves, en realidad nada se cambiará en el registro (de alli el nombre de actualización en falso), sin embargo sobre este será puesto un bloqueo que se liberará con el próximo commit/rollback.

Si dejas las transacciones como nowait, te saltará una excepción inmediatamente trates de hacer esto, que ya será cosa de "atrapar" para realizar las acciones pertinentes, por ejemplo, no permitir la edición del registro.

algo como:

Código Delphi [-]
Procedure TDataModule1.TablaAfterUpdate(Parametros...);

Begin
  try
    LanzarActualizaciónEnFalso;
  except
    // dio error!
    Tabla.Cancel; // Evitamos que quede en modo de edición
    raise;  // lanzamos nuevamente el error para que se maneje afuera
  end;
end;

Desde mi punto de vista, con esto estas echando a perder una de las grandes ventajas de firebird (y de muchas de las bases de datos relacionales serias)... asi que te aconsejo pensarla otras dos veces y ver si mejor cambias tu forma de pensar para aprovechar esta gran característica.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #6  
Antiguo 31-05-2005
inferno inferno is offline
Miembro
 
Registrado: may 2005
Posts: 10
Poder: 0
inferno Va por buen camino
Multiusuario

hola jachguate que tal cuando tu dices "Desde mi punto de vista, con esto estas echando a perder una de las grandes ventajas de firebird (y de muchas de las bases de datos relacionales serias)... asi que te aconsejo pensarla otras dos veces y ver si mejor cambias tu forma de pensar para aprovechar esta gran característica."

tu quieres decir que firebird ejecuta el bloqueo y desbloque por si solo para resguardar la integridad de la data y evitar falsa lectura de datos.

tambien se puede decir que firebird es multiusuario (varias aplicaciones conectadas a una misma base de datos me explico)
Responder Con Cita
  #7  
Antiguo 31-05-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
No soy bueno dando argumentos... pero San Google si que lo es...

Por lo pronto, y aunque el enfoque no es precisamente el mismo, este artículo de marteens también habla algo del tema.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #8  
Antiguo 31-05-2005
lbuelvas lbuelvas is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 377
Poder: 22
lbuelvas Va por buen camino
Hola foro,

No sea si el caso aplica, pero en las nuevas aplicaciones que estoy desarrollando me toco hacer algo especial con los IBDataset.

Resulta que si tienes campos calculados o que son actualizables por los triggers e incluso por algunos procedimientos almacenados, estos campos no deberian estar en la propiedad ModifySQL.

Esto se debe a que, cuando tu colocas un registro en edicion con un objeto IBDataset, tienes del lado del cliente el valor del campo en el momento que abriste el IBDataset (Cliente1).

Si el otro usuario (Cliente2) ejecuto el procedimiento y cambio el valor del campo, cuando el Cliente1 de grabar (Dataset.Post) va a mandar hacia el motor de base de datos el valor que habia traido originalmente, es decir, reescribiria con un valor antiguo.

En cierto aplicativo me pasaba que los saldos de los clientes en un sistema de facturacion con una frecuencia de uno o dos clientes al mes, se descuadraban, y busque y busque y nada, pues resulta que otro proceso actualizaba el saldo y casualmente habia otro usuario modificando algun campo menor del cliente como el telefono o direccion. La solucion, si el campo es mantenido por triggers o procedimientos almacenados, no debe ser actualizable desde el cliente.

En algunos sistemas se necesita que un procedimiento actulice datos , por ejemplo, si se ha descuadrado un invetario, razon en la que no deberia haber usuarios conectados para realizar dicha actividad.

Podrias dar mas detalles para ayudar con alguna solucion ?
__________________
Luis Fernando Buelvas T.
Responder Con Cita
  #9  
Antiguo 31-05-2005
RESP 3.0 RESP 3.0 is offline
Miembro
 
Registrado: may 2005
Posts: 29
Poder: 0
RESP 3.0 Va por buen camino
Bien recibida

Pues gracias vos Jachguate, voy a probar con los bloqueos optimistas y de alguna manera informarle e los usuarios que el registro esta bloqueado, la verdad me parece un poco chapucera esa forma de manejar datos con los componentes IBX, lo que se me ocurre tambien es utilizar TUpdateSQL, ya que estos me permitiran realizar la lectura de datos, y al momento de actualizar realizar una relectura de datos para poder actualizar correctamente. Ya probare y colocare aca mis resultados.

Gracias
Responder Con Cita
  #10  
Antiguo 03-06-2005
RESP 3.0 RESP 3.0 is offline
Miembro
 
Registrado: may 2005
Posts: 29
Poder: 0
RESP 3.0 Va por buen camino
Asunto resuelto

Bueno gracias por las respuestas quiero contarles que segui los consejos de Ibuelvas de no colocar en el ModifySQL los campos que son modificados por medio de SP o Triggers y todo va a la perfeccion siempres seguire con mas pruebas y cualquier cosa por aca me veran

Hasta Luego y gracias
Responder Con Cita
Respuesta



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


La franja horaria es GMT +2. Ahora son las 15:37:02.


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