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 29-08-2003
Tauhr Tauhr is offline
Miembro
 
Registrado: jul 2003
Ubicación: concepcion-chile
Posts: 11
Poder: 0
Tauhr Va por buen camino
Bloqueos de Registros

Hola a Todos:
Estoy trabajando en una aplicacion en Delphi 5 y con motor Firebird 1.5 release candidate 4.
Tengo la aplicacion con el IBTransaction en Read-Commited, mi problema es que no me bloquea los registros.es decir,si el cliente 1 abre un registro y el cliente 2 abre el mismo registro, el cliente 2 lo puede borrar sin ningun problema y no da ningun tipo de bloqueo.
En resumen lo k kiero es k si un cliente abre un registro, solamente este registro se bloquee para los demas usuarios y los demas no puedan realizar procesos sobre dicho registro.
Desde ya muchas gracias por toda la ayuda k me puedan brindar ya k soy nuevo en esto .
__________________
Código PHP:
Siempre hare todo por ayudar a kien lo necesite... 
Responder Con Cita
  #2  
Antiguo 29-08-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 24
kinobi Va por buen camino
Hola,

los bloqueos en InterBase y Firebird se gestionan de forma implícita por el servidor y sólo existen para el caso de los redactores a otros redactores ... hasta ahora.

La versión 1.5 añade una nueva extensión a la sentencia SELECT de forma que un lector puede bloquear a otros redactores, aunque nunca a otros lectores. Te pego la descripción de la nueva característica tal cual, ya que no tengo instalado ahora mismo la versión 1.5 ...

"...
SELECT ... FROM <sometable> [WHERE ...] [FOR UPDATE [OF ...]] WITH LOCK;

The WITH LOCK clause lets you lock the selected rows so that
other users cannot lock or update the rows until you end your
transaction. You can specify this clause only in a top-level
SELECT statement (not in subqueries). This clause can be used
in DSQL and PSQL.
..."


Saludos.
Responder Con Cita
  #3  
Antiguo 30-08-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cool

Lo que pasa es que interbase tiene una visión super optimista de los bloqueos.... y estos solamente ocurren dentro de una transacción cuando un registro es modificado.

Otros usuarios podran seguir incluso haciendo selects sobre los registros borrados dentro de una transacción siempre que esta no haya recibido la sentencia commit.

Si queres que media vez un usuario lee un registro este no sea modificado/eliminado por otro usuario (una vision pesimista) entonces, podes utilizar el truco de hacer un update "inutil" sobre el registro para que este sea bloqueado.

Esto lo podes conseguir haciendo un update sobre la tabla.

Código:
  Update tabla
    set campo = campo
 where llave = LaLlave;
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
  #4  
Antiguo 30-08-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 24
kinobi Va por buen camino
Hola,

Cita:
Posteado originalmente por jachguate
Si queres que media vez un usuario lee un registro este no sea modificado/eliminado por otro usuario (una vision pesimista) entonces, podes utilizar el truco de hacer un update "inutil" sobre el registro para que este sea bloqueado.
estoy de acuerdo, aunque convendrás conmigo que el conocido método de la edición en vacío o "update inútil", no es en realidad un bloqueo pesimista. Sigue siendo optimista, ya que sigue "bloqueando" en el momento de la escritura (del update "inútil") y, por supuesto, sigue permitiendo el acceso de lectura de otras transacciones concurrentes. Todo ello es debido a que, en InterBase, el mecanismo de bloqueos -optimistas- (de redactores) no es un bloqueo propiamente dicho, y acaba convirtiéndose en un conflicto de actualización en el/los siguientes redactores (la información que pretenden actualizar en la base de datos ha cambiado desde el momento en que abrieron su transacción).

Saludos.
Responder Con Cita
  #5  
Antiguo 02-09-2003
Tauhr Tauhr is offline
Miembro
 
Registrado: jul 2003
Ubicación: concepcion-chile
Posts: 11
Poder: 0
Tauhr Va por buen camino
Gracias Amigos por responderme pero aun no entiendo mucho lo del update "inutil" (soy nuevo en esto de firebird),pero estoy trabajando con la release candidate 4 de firebird 1.5 asi es k voy a ocupar las sentencias entregadas por el maestro Kinobi....ahora vere como va todo. muchas gracias por la ayuda.
__________________
Código PHP:
Siempre hare todo por ayudar a kien lo necesite... 
Responder Con Cita
  #6  
Antiguo 02-09-2003
Tauhr Tauhr is offline
Miembro
 
Registrado: jul 2003
Ubicación: concepcion-chile
Posts: 11
Poder: 0
Tauhr Va por buen camino
Hola Amigos:
Intente con el codigo k me facilito Kinobi......mi codigo dentro del Select es este:
____________________________
select *
from CLIENTE
where CODCLI=:C
Order By CODCLI
For Update
With Lock
____________________________

al consultar por un registro del cliente en la aplicacion me sale esl siguiente error....
'DINAMIC SQL ERROR
SQL ERROR CODE=-502
ATTEMP TO REOPEN AN OPEN CURSOR'


No entiendo que pasa....ayudemenme por favor.
Obs:Me gustaria intentar con el Update "inutil",pero no se como hacerlo.
desde ya muchas gracias
__________________
Código PHP:
Siempre hare todo por ayudar a kien lo necesite... 
Responder Con Cita
  #7  
Antiguo 03-09-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 24
kinobi Va por buen camino
Hola,

Cita:
Posteado originalmente por Tauhr
Obs:Me gustaria intentar con el Update "inutil",pero no se como hacerlo.[/b]
como te ha dicho jachguate. Nada más abrir el Dataset, haces una edición "vacía" (dentro de la misma transacción que está utilizando el Dataset) ...

Código:
UPDATE <tabla>
  SET <un_campo_cualquiera> = <valor_campo> /* 1 */
  WHERE <clave> = <valor_clave> /* 2 */

/* 1 */ <valor_campo> es el valor que tiene en ese momento <un_campo_cualquiera>

/* 2 */ <valor_clave> es el valor de la clave del registro que quieres "bloquear"
a partir de este momento cualquier otro usuario (transacción concurrente) no podrá "tocar" (actualizar, eliminar) el registro que has "bloqueado".

Respecto a asunto de SELECT ... WITH LOCK no puedo ayudarte. Ahora no tengo instalado Firebird 1.5

Saludos.
Responder Con Cita
  #8  
Antiguo 03-09-2003
Tauhr Tauhr is offline
Miembro
 
Registrado: jul 2003
Ubicación: concepcion-chile
Posts: 11
Poder: 0
Tauhr Va por buen camino
Question

Hola a todos de nuevo...
He tratado por multiples formas pero no me resulta la edicion vacia...
Expondre lo k he hecho para k me diga k hice mal:
Tengo un DataSet llamado IBDCliente:
Propiedades:
SelectSql:
select *
from CLIENTE
where CODCLI=:C
Order By CODCLI

InsertSql:
insert
into CLIENTE
(CODCLI, RUTCLI, DVCLI, RAZSOCCLI, GIROCLI,DIRECCIONCLI, CIUDADCLI, FONOCLI, FAXCLI, FECHAREGCLI, CREDASIGCLI, CREDOCUPCLI, CREDDISPCLI, ENCARGADOCLI, TIPOCLI,ESTBLOQCLI, EMAILCLI, DIASCREDCLI, FULTVTACLI, CODLPCLI, COMUNACLI)
values
(:CODCLI,:RUTCLI,:DVCLI,:RAZSOCCLI,:GIROCLI,:DIRECCIONCLI, :CIUDADCLI,:FONOCLI,:FAXCLI,:FECHAREGCLI, :CREDASIGCLI,:CREDOCUPCLI,:CREDDISPCLI,:ENCARGADOCLI, :TIPOCLI,:ESTBLOQCLI,:EMAILCLI,:DIASCREDCLI,:FULTVTACLI,:CODLPCLI, :COMUNACLI)

DeleteSql
delete
from CLIENTE
where CODCLI=:OLD_CODCLI

ModifySql
update CLIENTE
set
RUTCLI=:RUTCLI,
DVCLI=:DVCLI,
RAZSOCCLI=:RAZSOCCLI,
GIROCLI=:GIROCLI,
DIRECCIONCLI=:DIRECCIONCLI,
CIUDADCLI=:CIUDADCLI,
FONOCLI=:FONOCLI,
FAXCLI=:FAXCLI,
FECHAREGCLI=:FECHAREGCLI,
CREDASIGCLI=:CREDASIGCLI,
CREDOCUPCLI=:CREDOCUPCLI,
CREDDISPCLI=:CREDDISPCLI,
ENCARGADOCLI=:ENCARGADOCLI,
TIPOCLI=:TIPOCLI,
ESTBLOQCLI=:ESTBLOQCLI,
EMAILCLI=:EMAILCLI,
DIASCREDCLI=:DIASCREDCLI,
FULTVTACLI=:FULTVTACLI,
CODLPCLI=:CODLPCLI,
COMUNACLI=:COMUNACLI
where
CODCLI=:OLD_CODCLI

despues de seleccionar el registro
hice esto en el Dataset:

IBDCliente.Close;
IBDCliente.ModifySQL.Clear;
IBDCliente.ModifySQL.Add('Update Cliente');
IBDCliente.ModifySQL.Add('Set RazSocCli=:RazSocCli');
IBDCliente.ModifySQL.Add('Where CodCli=:C');
IBDCliente.Params.ByName('C').AsInteger:=strtointCODCLI.Text);
IBDCliente.Open;

Claramente esta malo....pero k?
o en k me ekivoke?

puchas amigos ayudeneme por favor porque estoy en una nube negra....gracias
__________________
Código PHP:
Siempre hare todo por ayudar a kien lo necesite... 
Responder Con Cita
  #9  
Antiguo 03-09-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 24
kinobi Va por buen camino
Hola,

Cita:
Posteado originalmente por Tauhr Claramente esta malo....pero k?
(parece que utilizas IBX) Pasos a seguir ...

Nada más abrir el DataSet IBDCliente y situado sobre el registro que quieres "bloquear" (no hace falta que modifiques la propiedad ModifySQL), haz la edición vacía (llamada al método Edit + Post).

Una vez que has hecho lo anterior, y sin cerrar la transacción ni el DataSet, el registro quedará "bloqueado" para el resto de transacciones hasta que cierres (commit o rollback) la que tienes asociada al DataSet IBDCliente.

La duda que tengo es si comprendes que es lo que hace realmente la "edición vacía", ya que si no lo comprendes podemos estar dando vueltas al asunto días y días para que te funcione.

Saludos.
Responder Con Cita
  #10  
Antiguo 03-09-2003
Tauhr Tauhr is offline
Miembro
 
Registrado: jul 2003
Ubicación: concepcion-chile
Posts: 11
Poder: 0
Tauhr Va por buen camino
Talking

Hola a Todos:
Cita:
La duda que tengo es si comprendes que es lo que hace realmente la "edición vacía", ya que si no lo comprendes podemos estar dando vueltas al asunto días y días para que te funcione.
en realidad sí entendia lo k era una edicion "vacia", pero no sabia como llevarlo a la practica en delphi....lo probe y resultó....MUCHAS GRACIAS A TODOS POR LA AYUDA ENTREGADA Y POR EL TIEMPO K SE DAN PARA RESPONDER.
__________________
Código PHP:
Siempre hare todo por ayudar a kien lo necesite... 
Responder Con Cita
  #11  
Antiguo 13-10-2004
anita_sal anita_sal is offline
Registrado
 
Registrado: oct 2004
Posts: 1
Poder: 0
anita_sal Va por buen camino
Por favor ayudame Tauhr

Tengo el mismo problema que vos con el tema de bloqueo de registros.
No se donde hacer el update "inutil". Te agradecería enormemente si me explicas un poco como lo solucionaste y si tenés ganas mostrarme un ejemplo.
Desde ya te estaría muy agradecida.
Saludos y gracias.
Anita
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 22:28: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