[firebase-br] Dúvida for update with lock
Marcelo Barby
mib em teorema.inf.br
Sex Ago 20 10:10:19 -03 2010
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.
Mais detalhes sobre a lista de discussão lista