O que o SGBD deveria te ajudar é em criar uma restrição de integridade
correspondente; por exemplo, um CHECK CONSTRAINT.  Mas isso ainda não é
suportado
(http://www.postgresql.org/docs/8.2/interactive/sql-createtable.html).
A menos que se bagunce um pouco o modelo para que na mesma tupla haja o
identificador de usuário criador do pedido e do alterador.

No meu caso, qualquer usuario do banco e do sistema pode alterar o
pedido, é claro se é que foi le consedido estes direitos... tenho meu
propio controle de direitos no sistema...

neste problema o SELECT FOR UPDATE NOWAIT ja me resolve.. perfeitamente.

Veja como vou implementalo:

quando eu for alterar um pedito por exemplo, vou executar
SELECT * FROM PEDIDOS
where c_codigo='00001'
FOR UPDATE NOWAIT
se o registro nao estiver bloquado, a consulta vai me retornar os
dados, entao vou proceder com a alteracao... perfeito..!

ja o segundo usuario, vai executar a mesma consulta estando o primeiro
usuario ainda bloqueando o registro..
SELECT * FROM PEDIDOS
where c_codigo='00001'
FOR UPDATE NOWAIT
e neste momento, vai gerar um erro.. vou pegar o codigo do erro ou
coisa parecida, se for o referente a bloqueios, entao vou emitir um
aviso para o usuario, alertando-o que este pedido já está sendo
alterado por outro usuario. entao, ele terá que esperar desbloquear
para tentar novamente.

Agora a questao é, se o usuario1 deixar lá sua estacao com o pedito aberto?
existe alguma forma de o usuario2 saber qual é o usuario/estacao que
está bloqueando tal registro? Pois pode que este tenha a necesidade de
ir la aviar o carinha, ou mesmo.. fechar o pedito da estacao que está
alterando para poder abrir em sua propia estacao.. Este sim é um caso
que dificilmente vai acontecer.. mas nao se duvida, pois cada cliente
é diferente.

No caso do uso daquela tabelinha auxiliar que eu tinha implementado
provisoriamente e como demostrei funcionar perfeitamente inclusive com
controle de procpid para saber se a estacao que bloqueou o registro
continua on-line (pode que tenha dado algum corte de energia ou de
rede e caiu a conexao), Neste caso, nesta tabelinha posso incluir o
nome do usuario/estacao que está bloqueando.. estes dados eu pego a
nivel de aplicacao.. Mas eu gostaria de usar algo nativo do propio
banco..

é por isso que insisto em perguntar no cado do FOR UPDATE:
Sem como eu saber se o registro where cod='00001' que está bloqueado no momento:
Qual foi a estacao/IP/PROCPID que está mantendo bloqueado?
Se sim, aqui terminaria meu drama.

Grato pelas respostas...
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a