[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