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)
-   -   Problema con resgistro bloqueado (https://www.clubdelphi.com/foros/showthread.php?t=21967)

apicito 02-06-2005 13:07:02

Problema con resgistro bloqueado
 
Se me ha quedado bloqueado un registro en Firebird 5 con
Código:

select * from RESCON where RESCON_TIPO=1 for update with lock
ahora no consigo desbloquearlo.
He probado a hacer backup/restore, reiniciar el Firebird y nada.

_fede 02-06-2005 13:18:04

Registro Bloqueado
 
Hola, nunca he trabajado con Firebird 5, pero en Oracle se soluciona realizando commit.

Un saludo.

apicito 02-06-2005 13:26:47

He tenido que desinstalar el firebird, eliminar el directorio y volver a isntalarlo para que lo desbloquera. Es normal esto?.
Para ilustrar mejor el caso os pongo el código con el que bloqueo el registro. En toda la aplicación solo utilizo el bloqueo aquí.
Código:

  QueryResCon.Close;
  QueryResCon.SQL.Clear;
  if Res_Tipo='E' then
    QueryResCon.SQL.Add('select * from RESCON where RESCON_TIPO=1 for update with lock')
  else
    QueryResCon.SQL.Add('select * from RESCON where RESCON_TIPO=2 for update with lock');
  x:=1;
  while x < 10 do
    begin
      try
        QueryResCon.Open;
        x:=11
      except
        if x > 5 then
          begin
            Showmessage('Contador ocupado por otro usuario, intentalo de nuevo');
            Exit;
          end;
        x:=x+1;
      end;
    end;


jachguate 02-06-2005 16:47:03

¿Firebird 5!!?

chanfle!!... yo me quedé en la alpha de firebird 2.0... :o

apicito 02-06-2005 17:03:37

Cita:

Empezado por jachguate
¿Firebird 5!!?

chanfle!!... yo me quedé en la alpha de firebird 2.0... :o

Evidentemente:1.5

apicito 30-06-2005 18:50:57

Para que conste, por si alguien consulta este hilo más tarde, la solución fue desinstalar firebird y volver a instalarlo. Parece como si en algún sitio de la instalación quedase grabado que ese registro estaba bloqueado y al reinstalarlo se sobreescribiese ese sitio.

Rufus 01-07-2005 10:57:52

Apicito me parece interesante el problema que planteas.

Te confieso que en las aplicaciones que realizo con firebird nunca he utilizado WITH LOCK. Utilizando bien las transacciones y los bloqueos optimistas no he tenido problema aunque he de aclarar que los programas son ligeros y los utilizan normalmente entre 10 y 20 usuarios simultaneos aproximadamente.

Si lo que quieres es bloquear un registro a nivel edición ya sabemos que eso lo conseguimos aplicando un UPDATE ficticio sobre ese registro al comenzar la edición por un cliente aunque podemos tener problemas con los triggers y hay que controlarlos muy bien.

Dos enlaces interesantes:

- Notas de la versión 1.5:
http://www.ibphoenix.com/downloads/F...tesSpanish.pdf
En la página 15 se describe la opción WITH LOCK.

- Si lees bien ingles técnico te dejo este artículo que esta muy muy bien, sobre bloqueos en firebird:
http://www.interbase-world.com/en/articles/805.php

Un saludo

case 03-07-2005 02:03:09

Correcto. El uso de un SELECT con for update no me parece una muy buena opcion. Es preferible utilizar un UPDATE anterior o simplemente actualizar el registro y capturar la excepcion si hay un conflicto de versiones. Es mas simple, claro y ordenado. Ah, aparte de que el motor es muy eficiente para manejar estas situaciones sin necesidad de bloqueos.

apicito 04-07-2005 08:15:05

La aplicación está siendo utilizada simultáneamente por 20-30 usuarios y no había tenido problemas. La tabla que me ofrecia problemas era el del contador de registro de entrada, osea el asignador de numeros consecutivos. Es el único sitio en toda la aplicación en la que utilizo el WITH LOCK. A ese contador acceden ocasionalmente todos los usuarios pero en la oficina de entradas existen tres puestos que solo graban registros que utilizan ese contador, por lo que el nivel de concurrencias es muy alto. Me dio muchos problemas hasta que utilice el mecanismo que expuse en el primer mensaje, donde el concurrente intenta grabar diez veces y si no lo consigue da mensaje de concurrencia. Desde principio de año no me dió ningún problema, hasta este momento en que creo que no se trata de que funcione mal el WITH LOCK sino que el servidor hizo algo mal.
Un saludo.


La franja horaria es GMT +2. Ahora son las 18:42:49.

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