Skip site navigation (1) Skip section navigation (2)

Re: Duda en necesidad de bloquear tablas

From: "Jaime Casanova" <jcasanov(at)systemguards(dot)com(dot)ec>
To: "Arturo Munive [pgsql-es-ayuda]" <arturomunive(at)gmail(dot)com>
Cc: Postgresql <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Duda en necesidad de bloquear tablas
Date: 2008-06-21 03:19:14
Message-ID: 3073cc9b0806202019p175b5b11jd14d1b1f7da74d21@mail.gmail.com (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
2008/6/20 Arturo Munive [pgsql-es-ayuda] <arturomunive(at)gmail(dot)com>:
>
> los pagos pueden ser parciales para cada compra , es decir una compra puede
> ser cancelada(pagada) por uno o mas pagos
> el procedimiento lógico para efectuar un pago es el siguiente:
>
> 1. verifico que la compra no esta pagada.
> 2. calculo cuanto suman los pagos anteriores que se le hicieron a la compra
> 3. verifico que el valor del nuevo pago mas los pagos anteriores no superan
> al monto de la compra.
> 4. inserto el pago en su tabla
> 5. si la suma de los pagos es igual a el valor la compra, actualizo la
> compra estableciendo el campo pagada = TRUE.
>
[...]
>
> A. Como puedo asegurar que entre el instante que verifico la suma de los
> pagos anteriores (paso 3)y la inserción del pago que yo
>  quiero hacer (paso 4) nadie inserte (borre o modifique) otro pago para la
> misma compra.

una forma es usar transacciones serializables (estas simulan ir en
serie una tras otra)
http://www.postgresql.org/files/developer/transactions.pdf

>  ¿debo bloquear la tabla para no permitir inserciones?

Esta es otra opcion, pero en vez de bloquear toda la tabla podrias
usar SELECT .. FOR UPDATE para bloquear solo los registros
involucrados

>  ¿la debo bloquear incluso antes de leer los montos de los pagos anteriores,
> antes del paso 3?

En el caso de la tabla de compras es posible que tengas que hacerlo
porque tienes un campo calculado ahi... a menos que uses transacciones
serializables

>  Y si es asi como la bloqueo.
>

SELECT ... FOR UPDATE

> B. Si estos 5 pasos los hiciera dentro de un procedimiento almacenado, como
> haria para forzar que el procedimiento
>  termine y haga un rollback de cualquier dato actualizado es decir si tengo:
>  BEGIN
>    -- hago algun insert
>    -- hago algun update
>    IF (ocurre una condicion no deseada)
>    THEN
>      ROLLBACK
>    END IF;
>
>   Cuando hago algo como lo anterior me da el siguiente mensaje:
>
>   ERROR:  SPI_execute_plan failed executing query "ROLLBACK":
> SPI_ERROR_TRANSACTION
>
>   Cual seria la forma de dada una condicion deshacer los cambios en un
> procedimiento.
>

RAISE EXCEPTION

-- 
Atentamente,
Jaime Casanova
Soporte y capacitación de PostgreSQL
Guayaquil - Ecuador
Cel. (593) 87171157

In response to

Responses

pgsql-es-ayuda by date

Next:From: Miguel Rodríguez PenabadDate: 2008-06-21 13:53:35
Subject: Re: AYUDA CON TRIGER - URGENTE
Previous:From: Marcos SaldivarDate: 2008-06-21 01:36:23
Subject: Re: Duda en necesidad de bloquear tablas

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group