[firebase-br] Dúvida for update with lock
Visão On-Line - Marco Antônio
marco em visao-ol.com.br
Sex Ago 20 11:02:03 -03 2010
- Travar os registro na alteração.
SELECT * FROM tabela where codigo=1 FOR UPDATE WITH LOCK
----- Original Message -----
From: "Marcelo Barby" <mib em teorema.inf.br>
To: <lista em firebase.com.br>
Sent: Friday, August 20, 2010 10:10 AM
Subject: [firebase-br] Dúvida for update with lock
Pessoal,
Preciso fazer o travamento de um registro dentro de uma
procedure estou tendo alguns deadlock eventuais, gostaria de saber se o
seguinte procedimento é correto e poderá resolver, é uma tabela de
contadores de chaves primárias onde o processamento é todo feito no servidor
com acessos de dezenas de usuários concorrentes hoje utilizando terminal
server:
Detalhe que tentei utilizar FOR UPDATE WITH LOCK e o WITH
LOCK não é reconhecido pelo firebird. Utilizo 2.1
A parte da Procedure é a seguinte:
/* Aqui é para verificar se o contador já existe */
SELECT CONTADOR_CODIGO, count(CONTADOR_TABELA) FROM TEO_CONTADOR
WHERE (CONTADOR_TABELA = :IP_TABELA) AND
(EMPRESA_CODIGO = :IP_EMPRESA) AND
(CONTADOR_AUXILIAR = :IP_AUXILIAR)
GROUP BY CONTADOR_CODIGO
FOR UPDATE
INTO :R_CONTADOR, :V_CONTADOR;
/* Se é Nulo Cria com 0 */
if (:V_CONTADOR IS NULL) then
begin
/* Atualiza Contador */
INSERT INTO TEO_CONTADOR ("EMPRESA_CODIGO", "CONTADOR_TABELA",
"CONTADOR_AUXILIAR", "CONTADOR_CODIGO")
VALUES (:IP_EMPRESA, :IP_TABELA, :IP_AUXILIAR, :R_CONTADOR);
EXIT;
end
/* Gravação ou Adição de Valor */
if ((IP_TIPO = 'G') or (IP_TIPO = 'A')) then
begin
UPDATE TEO_CONTADOR SET CONTADOR_CODIGO = :R_CONTADOR
WHERE (CONTADOR_TABELA = :IP_TABELA) AND
(EMPRESA_CODIGO = :IP_EMPRESA) AND
(CONTADOR_AUXILIAR = :IP_AUXILIAR);
End
Grato
Marcelo Barby.
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use:
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa
Mais detalhes sobre a lista de discussão lista