sql >> Base de Datos >  >> RDS >> PostgreSQL

Bloquear una fila específica en postgres

Si desea bloquear la tabla en una fila seleccionada específica, debe LOCK FIRST ellos usan el FOR UPDATE / FOR SHARE instrucción. Por ejemplo, en su caso, si necesita bloquear la primera fila, haga esto:

BEGIN;

LOCK TABLE person IN ROW EXCLUSIVE MODE;

-- BLOCK 1

SELECT * FROM person WHERE name = 'John' and money = 1 FOR UPDATE;

-- BLOCK 2

UPDATE person set name = 'John 2' WHERE name = 'John' and money = 1;

END;

En el BLOCK1 antes de SELECT declaración que no está haciendo nada, solo le dice a la base de datos "Oye, haré algo en esta tabla, así que cuando lo haga, bloquee esta tabla en este modo". Puede seleccionar/actualizar/eliminar cualquier fila.

Pero en BLOCK2 cuando usas FOR UPDATE bloquea esa fila a otras transacciones en modos específicos (lea el doc para más detalles). Se bloqueará hasta que finalice esa transacción.

Si necesita un ejemplo, haga una prueba e intente hacer otro SELECT ... FOR UPDATE en BLOCK2 antes de finalizar la primera transacción. Estará esperando que finalice la primera transacción y seleccionará justo después.

Lo estoy usando en una función para controlar subsecuencias y es genial. Espero que disfrutes.