Jump to content
Marcelo_Ribeiro

Problema procedure - deadlock

Recommended Posts

E aí, blz?

Tô com um problemão. Tenho uma aplicação Delphi que chama uma procedure. Eu inicio uma transação  na aplicação, chamo a procedure, em seguida  faço outras coisas na aplicação e dou um commit. Porém, se dois usuários executam esse processo ao mesmo tempo, dá erro de deadlock.

Fiz um teste e executei a procedure duas vezes concomitantemente, e ainda assim deu deadlock

Essa procedure só faz delete em várias tabelas, onde passo o id do documento. A instrução é basicamente delete from tabela where id =numeroid

Não tenho ideia do que pode ser.

Muito obrigado. Fico no aguardo.
 
Valeu

Share this post


Link to post
Share on other sites

Sem ver o todo fica difícil opinar , mas

 

os registros em paralelo dependem entre si ? Em geral uma tabela que guarda número de sequencia etc (acessada por todos) gera isto.

veja quantas tabelas são "trancadas" no processo ?

o acesso é sempre via chave primária?

veja tanbém o " block-level" das tabelas envolvidas , pode estar "lockando" registros desnecessários.

existem triggers nas tabelas ?

 

 

 

Share this post


Link to post
Share on other sites

tem um código sequencial nessas tabelas. São em torno de umas 10 tabelas. nem todas as tabelas tem esse sequencial como primária. Tem uma tabela que ativa uma trigger que grava algumas informações numa tabela temporária. 

Na verdade, deveria dar um lock somente nos registros que o id = sequencial. o resto nem deveria interferir :(

 

 

Share this post


Link to post
Share on other sites

Quando digo sequencial pergunto , são sequences ou tabelas do tipo último registro + 1 ?

Esta trigger também pode ser teu gargalo

 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By AndersonVSilva
      Bom dia Pessoal,
       
      Efetuei uma busca no forum e não encontrei alguma solução para meu problema.
       
      Tenho este form via HTML:
       
      <td><form id="form1" action="CallProc02.php" method="post"><input type="hidden" name="id" value="1" /></form></td> <td><input form="form1" type="text" name="DDDA" value="Ex: 75" /></td> <td><input form="form1" type="text" name="NumA" value="Ex: 982825441" /></td> <td><input form="form1" type="text" name="DtInit" value="Ex: 2018-01-01" /></td> <td><input form="form1" type="text" name="DtEnd" value="Ex: 2019-01-01" /></td> <td><input form="form1" type="submit" value="Enviar" /></td> E aqui está o código PHP:
      <?php $sDDDA = $_POST['DDDA']; $sNumA = $_POST['NumA']; $sDtInit = $_POST['DtInit']; $sDtEnd = $_POST['DtEnd']; $con = new PDO("mysql:host:IP;dbname=DB", "User", "Pass"); $stmt = $con->prepare("CALL NOC_cobranca_conecta_historico_msisdn(:qDDDA, :qNumA, :qDtInit, :qDtEnd) "); $stmt->bindParam(":qDDDA", $sDDDA, PDO::PARAM_STR, 3); $stmt->bindParam(":qNumA", $sNumA, PDO::PARAM_STR, 10); $stmt->bindParam(":qDtInit", $sDtInit, PDO::PARAM_STR, 12); $stmt->bindParam(":qDtEnd", $sDtEnd, PDO::PARAM_STR, 12); $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); if ($result) { echo "OK"; } else { echo "NOK - Report Development Team"; } ?> No Apache ele fica logando o erro ' PHP Notice:  Undefined index: NumA in /var/www/html/Consulta/CallProc02.php' .
       
      Alguém pode me dizer oque estou fazendo errado?
       
      Obrigado desde já pela ajuda.
    • By Edilson Chaves
      Ola amigos, uso curso a algum tempo, só que desta vez estou apanhando de algo que aparentemente e bem simples. Tenho certeza que estou esquecendo algum detalhe.
      To a 2 dias me debatendo com isto.
      Por isto estou pedindo ajuda.
       
      O que pretendo fazer e criar um novo registro que mostre a evoluçao do crecimento mensal projetando o ponto de equilibrio. Para isto eu preciso pegar a soma do mês anterior e acrescentar a soma do atual.
       
      Esta é a Procedure. Abaixo explico o quer nao esta funcionado.
       
      DROP PROCEDURE IF EXISTS sp_Monitorado;
      DELIMITER $$
          CREATE PROCEDURE sp_Monitorado()
          BEGIN
              DECLARE done INT DEFAULT FALSE;
              DECLARE vVlrMesAtuPrv, vVlrMesAntPrv, vVlrMesAtuRea, vVlrMesAntRea, vPrevisto, vRealizado numeric(10,2);
              DECLARE vAnoAtu, vMesAtu, vOrdem, vAno, vMes INT;
              DECLARE vGrupo, vSubGrupo, vPessoa, vPessoaAtu VARCHAR(100);
              DECLARE cDados CURSOR FOR SELECT Ordem, Grupo, SubGrupo, Pessoa, Ano, Mes, Previsto, Realizado FROM vwresultadomonitoramento;
              DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
              OPEN cDados;
              read_loop: LOOP
                  FETCH cDados INTO vOrdem, vGrupo, vSubGrupo, vPessoa, vAno, vMes, vPrevisto, vRealizado;
                  IF done THEN
                     LEAVE read_loop;
                  END IF;
                  IF vOrdem <= 4 THEN
                      SET vVlrMesAtuPrv = vVlrMesAtuPrv + vPrevisto;
                      SET vVlrMesAtuRea = vVlrMesAtuRea + vRealizado;
                  INSERT INTO zzResultado VALUES (vOrdem, vGrupo, vSubGrupo, vPessoa, vAno, vMes, vPrevisto, vVlrMesAtuPrv);
                  END IF;
                  IF vOrdem = 4 THEN
                      SET vVlrMesAntPrv = vVlrMesAntPrv + vVlrMesAtuPrv;
                      SET vVlrMesAntRea = vVlrMesAntRea + vVlrMesAtuRea;
                      INSERT INTO zzResultado VALUES (99, vGrupo, 'PONTO DE EQUILIBRIO', vPessoa, vAno, vMes, vVlrMesAntPrv, vVlrMesAntRea);
                      SET vVlrMesAtuPrv = 0;
                      SET vVlrMesAtuPrv = 0;
                  END IF;
              END LOOP read_loop;
              CLOSE cDados;
          END;
      $$ DELIMITER;
       
      Quando co cursor entra nesta condiçao abaixo ele deveria pegar o valor acumulado anterior e acrescentar as variaveis (vVlrMesAntPrv, vVlrMesAntRea). So que o valor se perde e fica tudo zerado.
      Alguém pode me dizer onde estou errando.
      Anexo tem um print do resultado que pretendo ter
       
       IF vOrdem = 4 THEN
                      SET vVlrMesAntPrv = vVlrMesAntPrv + vVlrMesAtuPrv;
                      SET vVlrMesAntRea = vVlrMesAntRea + vVlrMesAtuRea;
                      INSERT INTO zzResultado VALUES (99, vGrupo, 'PONTO DE EQUILIBRIO', vPessoa, vAno, vMes, vVlrMesAntPrv, vVlrMesAntRea);
                      SET vVlrMesAtuPrv = 0;
                      SET vVlrMesAtuPrv = 0;
      END IF;
       

    • By mamotinho
      Olá, boa noite! estou em dúvidas e gostaria que alguém me ajudasse, bom eu tenho uma procedure no meu SQL 2017 e dentro da procedure tem if com com return de mensagem , e eu queria exibir essa mensagem após a pessoa executa a função no meu sistema. segue abaixo como está
       


    • By Felipe_N22
      Pessoal, como que eu crio uma rotina no MySQL para efetuar delete de registros inseridos nos últimos 30 dias, e fazer com que esse procedimento rode todos os dias automaticamente em determinado horário?
    • By johnklo
      COM BASE NA TABELA HR DO ORACLE
      Preciso criar uma sub-rotina (procedure) que imprima na tela o número de funcionários (employees) agrupados por departamentos (department_id). Deve-se ordenar a saída em ordem decrescente pela quantidade de departamentos. Pode-se utilizar qualquer forma de cursor para imprimir o resultado.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.