Oi Mário, Este é o problema a leitura nunca é bloqueada.
Fiz os testes pedidos, mas para mim não mudou nada!
Veja:
- Na sessão 1:
 db_teste=# BEGIN WORK;
 BEGIN
 db_teste=# LOCK TABLE tab_material IN ROW EXCLUSIVE MODE NOWAIT;
 LOCK TABLE
 db_teste=# UPDATE tab_material SET desc_serma = 'LAPIS Y' where
codg_serma='10';
 UPDATE 1
 db_teste=#   *** aguardando novo comando ***
- Na sessão 2:
  db_teste=# BEGIN WORK;
  BEGIN
  db_teste=# SELECT * FROM tab_material where codg_serma='10';
  codg_empr | codg_serma |  id_serma  | desc_serma
   -----------+------------+------------+------------+--------------+------
   202       |         10 | 2020000010 | LAPIS Y    |

É isso ai!!!??
Obrigado.

2009/8/11 Mário Oshiro <mario.osh...@gmail.com>

> Em SQLServer, fiz um teste parecido com o seu.
>
> Qdo vc faz um lock de registro ou trabela,  ele nao bloqueia a leitura
> de outras sessoes, ate' que a
> sessao de posse do lock, faça um update de algum dado do registro.
>
> Para bloquear o select que vc fez, faca em seguida um update com a mesmo
> where assim :
>
>  db_teste=# SELECT * FROM tab_material where codg_serma='10' FOR UPDATE;
>  update tab_material set codg_serma='10' where codg_serma='10' ;
>
> teste la e depois envie o resultado.
>
> até mais.
>
>
>
> MIGUEL JOSE DE LIMA wrote:
> > 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!
> >      E AI ALGUÉM PODE ME AJUDAR!?
> >
> > Obrigado!
> >
> >
> >
> >
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > pgbr-geral mailing list
> > pgbr-geral@listas.postgresql.org.br
> > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
> >
>
> _______________________________________________
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a