SELECT FOR UPDATE no FORMS FAZ LOCK EM TABELAS E PARA TUDO.

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
marcelo9i
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Ter, 25 Out 2005 3:10 pm
Localização: RJ
Marcello Rodrigo

Percebi que quando tenho um bloco base table no forms e tendo realizar um commit ele faz um select FOR UPDATE e se uma transação já estava em andamento (um update sem commit por outro usuário) o forms fica em WAIT até que a transação do outro usuário terminte.
Já tentei usar o parâmetro do bloco: LOCKING MODE DELAYED e IMMEDIATE e nada..

ALgué sabe como posso fazer com que ele não faça SELECT FOR UPDATE ?
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Bem, deve haver algum outro problema aí, pois o Locking Mode funciona perfeitamente!

LOCKING MODE - IMMEDIATE
Bloqueia o registro (com select update) assim que o usuário altera qualquer coisa no registro. Caso o registro esteja bloqueado, ele dá uma mensagem de erro assim: "Could not reserve record. Keep trying ?"

Imagem

LOCKING MODE - DELAYED
Não bloqueia o registro imediatamente, apenas quando for dar o COMMIT que ele verifica se a linha foi alterada por alguém.

Eu fiz o seguinte teste:
Criei um form com apenas um bloco. (em modo Delayed)

Rodei ele duas vezes (ou seja, duas sessões diferentes).
Na sessão A, alterei uma linha e NÃO GRAVEI.
Na sessão B, alterei a mesma linha, e ele permitiu alterar! beleza!
Gravei a sessão A. OK, deu certo.
Tentei gravar a sessão B, deu erro, pois já foi alterado por outro usuário.

Faça o teste aí num form só com 1 bloco. :-o
PS: qualquer outra informação, manda aí pra galera!!!
suelana
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 63
Registrado em: Qui, 10 Ago 2006 6:07 pm
Localização: Joinville-SC
Suelana BLU-JLLE

olá, Dr. Gori !

E o LOCKING MODE: Automatic ? como funciona ?
:roll:

Sds,
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

O Automatic é IDENTICO ao Immediate (quando o banco for oracle). Se for outro banco, de acordo com o manual, ele vai se comportar ao máximo como o Immediate. :-o
Avatar do usuário
fabricio.silva
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 34
Registrado em: Seg, 12 Mar 2007 7:07 am
Localização: Catanduva/SP
Fabricio M. Silva
Oracle Certified Associate
------------------------------
Catanduva - SP

Ola pessoal,

Primeiramente gostaria de parabenizar a todos forum, espero poder colaborar com a comunidade.

Na empresa onde trabalho, nós tivemos um problema semelhante, mesmo alterando o Loking Mode.

Consegui resolver o problema qd adicinei um trigger ON-LOCK no bloco. Dentro do on-lock você pode fazer um SELECT ... FOR UPDATE apenas do registro que esta alterando. No final, fica assim:

Selecionar tudo


declare
	vExiste varchar2(1);
begin
  select 'x'
    into vExiste
    from tabela
   where codigo = :tabela.codigo
     for update nowait;
exception
	when others then 
	  message('Atenção: Outro usuário está alterando este registro.');
	  raise form_trigger_failure;
end;

É importante especificar na WHERE a PK completa.

Espero ter ajudado,

Abs.
alexpere
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Qua, 02 Mai 2007 3:36 pm
Localização: Rio de Janeiro - RJ
Alexsandro Soares Pereira

Prezados amigos,

sou novo no fórum e logo de cara me deparei com um problema interessante. Pesquisando nos tópicos, encontrei este tópico antigo sobre travamento no forms que é bem antigo agora. Por isto, torço para que os nobres amigos possam me dar algum tipo de ajuda.

O que está me acontecendo é justamente o contrário. Ele não trava nada.
Tentei usar tanto o Immediate quanto o Delayed na propriedade Locking Mode e nada! Ele não faz nenhum lock. Copiando o teste do Thomas F.G., fiz o seguinte teste:

Criei um form com apenas um bloco. (em modo Delayed)

Rodei ele duas vezes (ou seja, duas sessões diferentes).
Na sessão A, alterei uma linha e NÃO GRAVEI.
Na sessão B, alterei a mesma linha, e PERMITIU alterar!
Gravei a sessão A, PERMITIU ALTERAR!
Tentei gravar a sessão B, deu erro, pois já foi alterado por outro usuário.

Fiz a mesma coisa em modo Immediate e a mesma coisa!

Como faço para forçar o Lock no bloco? Será que vamos ter que fazer o que o Fabrício Silva sugeriu no On-Lock? Será que isto não é problema de configuração?

Atenciosamente.
GuiSS
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Seg, 14 Jun 2010 11:17 am
Localização: São Paulo, SP
Guilherme

Bom, espero que alguém possa me ajudar tb...
O negócio é o seguinte....

Existe um forms que faz consulta numa determinada tabela A. Ele está aberto em uma sessão.

Existe outro forms aberto em outra sessão que insiro informações nesta mesma tabela A.
Devido a regra de negócio desse forms, ele busca algumas informações na tabela A, lockando determinados registros, validando alguns campos a serem inseridos. Por acaso (devido as condições da query), um dos registros a ser lockados é o que está sendo consultado na outra sessão.
Porém, não consigo lockar o registro, acaba dando um erro pois o registro já está lockado.

Portanto, queria saber se existem outras formas de LOCK, pois neste forms de consulta, não encontrei nenhum "for update of", e não tem update ou delete, por ser somente de consulta.

já viram algo parecido?
TUdo bem que estou no forum de PL/SQL, e não no de forms, mas não custa aproveitar o topico, né... rs...

Abraços!
GuiSS
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Seg, 14 Jun 2010 11:17 am
Localização: São Paulo, SP
Guilherme

Bom...
Descobri qual era o meu problema há um tempo, mas não havia tido tempo de passar para vocês daqui.

Na primeira sessão (consulta), um dos campos, que era baseado em tabela, estava sendo atualizado na trigger POST-QUERY do meu bloco, para tratamento, por ser um campo LOB.
Como este forms não tem a opcao de salvar, e nem pergunta se precisa salvar, por ser somente de consulta, o registro permanecia LOCKADO como se tivesse alterado.

Enquanto na outra sessão, eu tb precisaria atualizar este registro.

A solução foi criar um campo auxiliar, não baseado em tabela, para a minha tela de consulta, onde o valor do campo LOB seria tratado lá dentro. Este campo seria exibido no lugar do campo baseado em tabela...

não sei se expliquei direito... Mas é isso aí!

Abraços!
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 13 visitantes