Ir para conteúdo
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

Compartilhar este post


Link para o post
Compartilhar em outros 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 ?

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros 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 :(

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Esta trigger também pode ser teu gargalo

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora


  • Próximos Eventos

  • Conteúdo Similar

    • Por MANOEL ÉRIK P. DA SILVA
      Gostaria de saber onde está o erro desta procedure, pois ela coloca todos os campos do registros: PROCEDURE `Consultar---ome`(Nome varchar(70))
      begin
          select   *   from TABELA    where   Nome LIKE concat  ('%', Nome,'%');   
      end
      Obrigado pela ajuda.
      Manoel Érik
    • Por Anonn
      Tenho uma procedure que faz o cadastro do que está inserido nos input.... porém ele está dando o seguinte erro ao enviar....
       
      Fatal error: Cannot pass parameter 2 by reference in C:\wamp64\www\crud1\crud\2models\user-register\user-register-model.php on line 109
       
      A procedure no php está assim.... Dei umas pesquisadas mas não consegui resolver o meu problema.... Se puderem me ajudar ficaria grato.
      $rs = $this->db->pdo->prepare("call db.inserirUsers(?, ?, ?, ?, ?) VALUES (:Nome, Rua, Sexo, users_user_id, Estado)"); $rs->bindParam(1, ':Nome', $_POST['Nome'], PDO::PARAM_STR); $rs->bindParam(2, ':Rua', $_POST['Rua'], PDO::PARAM_STR); $rs->bindParam(3, ':Sexo', $_POST['radio'], PDO::PARAM_STR); $rs->bindParam(5, ':Estado', $_POST['estado'], PDO::PARAM_STR); $rs-> execute(); for ($i = 1; $i <5; $i++) { if (!empty($Outros[$i])) { $rs = $this->db->pdo->prepare("call db.inserirOutros(?) VALUES (:Outros)"); $rs->bindParam(':Outros', $_POST['Outros'.$i], PDO::PARAM_STR); $rs-> execute(); } }  
    • Por mamotinho
      Olá, sou iniciante e gostaria de saber como eu posso criar uma consulta e em seguida passar o valor da consulta por ifs veja um exemplo de como eu queria usar, irei fazer como seria em  PHP:

       
      $consulta = mssql_query("select * from Account.dbo.cabal_auth_table where Login=1"); $count = mssql_num_rows($consulta); if($count>=1){ while($row=mssql_fetch_object($consulta)){ mssql_query("update cabalcash.dbo.cashaccount set cash=cash+40 where UserNum='".$row->UserNum."'"); } } Queria transformar isso em Store Procedure para eu criar uma JOB 
    • Por elton07
      Pessoal boa noite!
      Preciso de um help, dos especialistas rs.
       
      Seguinte, estou desenvolvendo uma aplicação de controle de estoque básica (ASP.NET COM MYSQL), onde incluo via aplicação mais de um registro em uma tabela, [entrada_produto_item], e tenho a seguinte procedure.

       
      DELIMITER // CREATE PROCEDURE `SP_AtualizaEstoque`( `idproduto` int, `qtde_produto_item` int, `idalmoxarifado` int) BEGIN declare contador int(11); SELECT count(*) into contador FROM estoque WHERE idproduto = idproduto; IF contador > 0 THEN UPDATE estoque SET qtde=qtde + qtde_produto_item WHERE idproduto = idproduto and idalmoxarifado=idalmoxarifado; ELSE INSERT INTO estoque (idproduto, qtde,idalmoxarifado) values (idproduto, qtde_produto_item,idalmoxarifado); END IF; END // DELIMITER ;  
      Que é chamada pela TRIGGER
       
      DELIMITER // CREATE TRIGGER `TRG_EntradaProduto_AI` AFTER INSERT ON `entrada_produto_item` FOR EACH ROW BEGIN CALL SP_AtualizaEstoque (new.idproduto, new.qtde_produto_item , new.idalmoxarifado); END // DELIMITER ;  
      Porém ao incluir via aplicação mais de um registro de produtos com ID diferentes na tabela  entrada_produto_item, ao analisar a tabela [estoque] que é controlada pela procedure (SP_AtualizaEstoque), não mostra mais de um registro, apenas está incrementando no mesmo registro a quantidade de produtos informado.
       
      Minha suspeita seja que na Procedure o filtro ".... idproduto = idproduto" não esteja fazendo distinção dos códigos diferentes dos procutos incluidos.
       
      Alguém consegue me ajudar? desde já agradeço
    • Por mamotinho
      Olá, estou recentemente estudando o PDO , já conseguir usar INSERT/UPDATER/DELETE porém eu utilizo banco de dados MSSQL SERVER 2008 estou tentando usar o método exec para eu executa a procedure que contém mais inserção dentro dela.
       
      tentei utilizar o mesmo modelo que faço:
      EXEMPLO:
          $ClassProcedure  = $conexao->prepare("EXEC Account.dbo.pdoteste (:Login, :country, :firsname)");
       
      mais não funciona, o PDO utiliza outra forma de executa procedure? se sim alguém poderia me fazer uma execução demonstrativo por favor.
      quero utiliza essa função para cadastro com o methodo $_GET
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.

Este projeto é mantido e patrocinado pelas empresas:
Hospedado por: