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
