[Pgsql-ayuda] Invocacion de una funcion

Edwin Quijada listas_quijada@hotmail.com
Wed, 13 Aug 2003 13:12:19 -0400


>
> No.  Podrias hacer un LOCK TABLE tabla-de-secuencias que sea obligatorio
para
> crear un nuevo documento y usar tu funcion.  Pero sin el LOCK, puedes
meterte
> en lios.
>
Hacer esto no seria problematico ya que estaria bloqueando la tabla
completa..?
Hacia esto en 4th Server pero bloqueaba a nivel de registro. Es decir,
cuando buscaba el record yo mismo lo bloqueaba
y si ya estaba bloqueado por alguien me quedaba esperando hasta que se
liberara, el codigo era algo como esto:
--
    Buscar Secuencia con el Tipo de Documento
    Repeat
         Cargar Registro
          Si (Record esta bloqueado)
             Mensaje("Esperando por el registro para actualizar la
secuencia")
          else
            Actualizar secuencia + 1
          Fin - Si
     Until (Record No este Bloqueado)
  Desbloquear Registro
---
Si te das cuenta estoy tratando de hacer lo mismo por eso use un SELECT FOR
UPDATE porque segun dice el manual este bloquea el record, ahora bien la
pregunta seria si este comando, si el registro ya esta bloqueado, como se
comportaria?

Como yo podria saber si el registro esta bloqueado o alguien ya lo esta
usando?

Con cual comando desbloquear el record?
>
> BTW:
> > Explicame porque dices que esta forma no es correcta??
>
> Piensa lo que pasa cuando mas de una transaccion es ejecutada
concurrentemente.
> Has oido hablar de una "condicion de carrera" (race condition)?  En tu
funcion,
> hay una entre el momento en que haces el SELECT y el momento en que haces
el
> UPDATE.  Si nunca te ha pasado nada, es pura suerte (o has usado sistemas
menos
> concurrentes que Postgres, por ej. que hacen un LOCK TABLE implicitamente)
Realmente no hacian un LOCK TABLE mas bien era un LOCK RECORD  al momento de
cargar
un registro
>
> --
> Alvaro Herrera (<alvherre[@]dcc.uchile.cl>)
> "La felicidad no es maņana. La felicidad es ahora"
>