Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Bloqueos de Registros (https://www.clubdelphi.com/foros/showthread.php?t=3264)

Tauhr 29-08-2003 20:28:27

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 :).

kinobi 29-08-2003 21:51:39

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.

jachguate 30-08-2003 00:04:55

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.

;)

kinobi 30-08-2003 07:11:40

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.

Tauhr 02-09-2003 17:18:21

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. :D

Tauhr 02-09-2003 17:33:11

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'


:confused: No entiendo que pasa....ayudemenme por favor.
Obs:Me gustaria intentar con el Update "inutil",pero no se como hacerlo.
desde ya muchas gracias

kinobi 03-09-2003 05:50:53

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.

Tauhr 03-09-2003 20:06:09

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

kinobi 03-09-2003 20:25:32

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.

Tauhr 03-09-2003 21:11:25

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.

anita_sal 13-10-2004 21:34:31

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


La franja horaria es GMT +2. Ahora son las 17:51:26.

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