Olá,

Vamos lá. Deixa eu ver se entendi o seu problema. O registro que está
bloqueado você não quer que o mesmo seja lido é isso?




2009/8/11 MIGUEL JOSE DE LIMA <[email protected]>

> Caros, participantes...
> Sou iniciante neste mundo do PostgreSQL.
> Trabalho com outro Banco de Dados - ADABAS (UNIX SOLARIS/MAINFRAME),
> mas me incubiram de fazer testes no PostgreSQL para bloquer registros.
> Então...
>
> Estou precisando de ajuda para bloquear a leitura de um registro, ou seja,
> em um cenário como:
>  "Atualização de Estoque de um Material" :
> Antes de atualizar o estoque do material selecionado eu preciso bloquear o
> registro para que
> nenhuma outra sessão possa obter o dado do registro.
> PRECISO DE UMA LEITURA EXCLUSIVA - TOTALMENTE RESTRITIVA.
> Estou usando o PostgreSQL 8.3.7 para os testes - em linux
> Já li e reli sobre o Isolamento de Transação, mas pode ser que eu não
> esteja entendendo...???
> Fiz o seguinte teste via psql:
> - Na Sessão "A"
>   db_teste=# BEGIN WORK;
>   BEGIN
>   db_teste=# LOCK TABLE tab_material IN ROW EXCLUSIVE MODE NOWAIT;
>   LOCK TABLE
>   db_teste=# SELECT * FROM tab_material where codg_serma='10' FOR UPDATE;
>   resultado obtido ok!
>   *** aqui eu preciso bloquear todos os materiais/itens (de um pedido) -
> como ex. fiz de apenas 1 (um).
>
> - Na Sessão "B":
>     ** Fiz o mesmo SELECT sem a clausula FOR UPDATE:
>   SELECT * FROM tab_material where codg_serma='10'
>
>   ** aqui eu obtive o resultado ok da leitura.
>      Portanto, é aqui, neste ponto que não deveria permitir nenhuma
> leitura, já que sessão "A" ainda não terminou!


 Por que o registro aqui não pode ser lido? O PostgreSQL não bloqueia
operações de leitura, bloqueia operações de escrita como update e delete.
Por exemplo, se o registro tivesse sido modificado na sessão "a" o
PostgreSQL na sessão "B" iria ler o valor antigo antes da atualização porque
a mesma não foi efetivada (commit).

Por exemplo:

Para ficar mais claro, criei uma tabela chamada tab e contém 10 registros,
com valores de 1 a 10.

CREATE TABLE tab(codigo int);
INSERT INTO tab VALUES (generate_series(1,10));

SESSAO A:

BEGIN;
SELECT * FROM tab WHERE codigo=1;
UPDATE tab SET codigo=100 WHERE codigo=1;
--Vá para a SESSAO B;
COMMIT;


SESSAO B:
BEGIN;
SELECT * FROM tab WHERE codigo=1;
--Aqui você verá o registro 1 pois a transação (SESSAO A) que modificou este
registro ainda não foi efetivada. O registro de código 100 só será visível
aqui se for executado o comando commit na sessão anterior.
COMMIT;

Agora você conseguirá ver o registro atualizado nesta sessão.

Sua idéia era acontecer o que quando você tentasse ler o registro alterado
na SESSAO A?




>      E AI ALGUÉM PODE ME AJUDAR!?
>
> Obrigado!
>
>
>
>
>
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>
Espero ter ajudado.

Qualquer dúvida pergunta ai.

[]s

-- 
JotaComm
http://jotacomm.wordpress.com
http://www.dextra.com.br/postgres
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a