Carregando ...
Desculpe, ocorreu um erro ao carregar o conteúdo.

14635Re: [cflp] deadlocks

Expandir mensagens
  • Artur Anjos
    23 de jul de 2014

      Exactamente isso. O seu programa não irá esperar e retornará logo o erro. Por isso o avisei que o contador não seria incrementado, e se quiser ser exacto teria de recorrer a outros meios.

      Artur

      Em 23-07-2014 13:54, Claudinei Walter Simons clsimons@... [cflp_suporte] escreveu:
      bom dia!

      até onde eu sabia o NOWAIT é para nao aguardar por uma solução do conflito e retornar o erro imediatamente quando o conflito ocorra...


      Em 22 de julho de 2014 17:21, Artur Anjos listas@... [cflp_suporte] <cflp_suporte@...> escreveu:
       

      Rogério,

      Para a utilização em site você tem algumas formas diferentes de fazer isto.

      Ou o seu site tem realmente uma quantidade enorme de pessoas a fazer a mesma coisa, ou o mais provável é que esta parte do bloco faça parte de uma parte maior de bloco a correr tudo na mesma transação.

      Eu começaria por isolar este código (pelo que percebo conta a quantidade de vezes que uma parte do site é clicada), numa única transação. Isto de certo que iria diminuir imenso o número de erros que lhe ia retornar, mas continuaria a não tornar isento de problemas o seu codigo.

      Pelo codigo, vê-se que você está a usar uma transação em todo o bloco. Por default, as transações em PHP são:
      IBASE_WRITE|IBASE_CONCURRENCY|IBASE_WAIT

      Experimente isolar numa transação simplesmente esta parte do código:

        if (ibase_query($db,$query)) {
            ibase_commit($db);
          }

      para:

      $tr = ibase_trans(IBASE_WRITE|IBASE_CONCURRENCY|IBASE_NOWAIT);
        if (ibase_query($tr,$query)) {
            ibase_commit($tr);
            }
         else {
         ibase_rollback($tr);

           }
         
      Isto fará duas coisas:
      1) Isola esta específica parte do seu codigo do resto do código da pagina que usa a mesma conexão (e a transação por defeito);
      2) em caso de erro, o seu hit não ficará registado, mas também não retornará erro (devido ao IBASE_NOWAIT)

      Penso que esta será uma solução elegante. Você pode alimentar uma tabela auxiliar com os hits que lhe escaparam se quiser ter valores realmente exactos.

      Artur

       


      Em 22-07-2014 11:35, Rogério Pett rogeriopett@... [cflp_suporte] escreveu:
      Bom dia pessoal,

      temos um site que a cada vez que é lido um determinado registro, é também feito um update num campo numérico com o sql abaixo

      update BLOCOS set BLO_HITS=BLO_HITS+1 where BLO_CODIGO=variavel_codigo

      só que está me retornando muitos erros do tipo abaixo
      ibase_query(): deadlock update conflicts with concurrent update concurrent transaction number is 5746758

      a parte do código é esta abaixo
          $query="update BLOCOS set BLO_HITS=BLO_HITS+1 where BLO_CODIGO=$row->BLO_CODIGO";
          if (ibase_query($db,$query)) {
            ibase_commit($db);
          }

      como posso resolver esse erro de deadlock update conflicts?


      []'s
      Rogério Pett
      www.pett.com.br

      ------------------------------




      --
      Claudinei Walter Simons
      Sarandi-RS
      Comercial:
      New System
      Avenida Independência

    • Mostrar todas as 10 mensagens neste tópico