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 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.
    • By Andinho Luiz
      Boa tarde a todos,
       
      Estou tentando criar uma Procedure no MySQL e tenho esta tabela "Cliente". 
       
      CREATE TABLE IF NOT EXISTS cliente ( id_cliente INT(5) AUTO_INCREMENT PRIMARY KEY, tipo CHAR(1) NOT NULL, rSocialNome VARCHAR(20) NOT NULL, cnpjCPF VARCHAR(30) NOT NULL, ieRG VARCHAR(30), contato VARCHAR(50), email VARCHAR(30), site VARCHAR(30), dataCadastro DATE, usuario VARCHAR(30) )ENGINE=MyISAM; Tenho outra tabela que é a "Endereço"
      CREATE TABLE IF NOT EXISTS `endereco` ( `id_endereco` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `id_cliente` INT(11) NOT NULL, `logradouro` VARCHAR(20) NOT NULL , `rua` VARCHAR(25) NOT NULL , `numero` INT(11) NOT NULL , `complemento` VARCHAR(40) , `bairro` VARCHAR(40) NOT NULL , `cidade` VARCHAR(40) NOT NULL , `estado` VARCHAR(40) NOT NULL , `cep` VARCHAR(9) NOT NULL , PRIMARY KEY (`id_endereco`), constraint fk_endereco_cliente FOREIGN KEY (id_cliente) REFERENCES cliente (id_cliente) ) ENGINE=MyISAM  
      Para fazer o insert nas duas tabelas eu criei uma procedure, podem quando tento adicionar o MySQL da erro "ALERTA: Erro ao inserir na tabela de pessoas"
       
      DELIMITER $$ CREATE DEFINER=`dotinfoc`@`localhost` PROCEDURE `cad_cliente`( IN c_tipo CHAR(1), IN c_rSocialNome VARCHAR(20), IN c_cnpjCPF VARCHAR(30), IN c_ieRG VARCHAR(30), IN c_contato VARCHAR(50), IN c_email VARCHAR(30), IN c_site VARCHAR(30), IN c_logradouro VARCHAR(20), IN c_rua VARCHAR(25), IN c_numero INT(11) , IN c_complemento VARCHAR(40) , IN c_bairro VARCHAR(40), IN c_cidade VARCHAR(40), IN c_estado VARCHAR(40), IN c_cep VARCHAR(9) ) BEGIN DECLARE msg VARCHAR(1000) DEFAULT "sem mensagem"; DECLARE excecao SMALLINT DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET excecao = 1; START TRANSACTION; INSERT INTO cliente (tipo, rSocialNome, cnpjCPF, ieRG, contato, email, site, dataCadastro, usuario) VALUES (c_tipo, c_rSocialNome, c_cnpjCPF, c_ieRG, c_contato, c_email, c_site); IF excecao = 1 THEN SET msg = "ALERTA: Erro ao inserir na tabela de pessoas"; ROLLBACK; ELSE SELECT DISTINCT LAST_INSERT_ID() INTO @id_cliente FROM cliente; IF excecao = 1 THEN SET msg = "ALERTA: Erro ao buscar o ultimo ID inserido em clientes"; ROLLBACK; ELSE INSERT INTO endereco(id_cliente, logradouro, rua, numero, complemento, bairro, cidade, estado, cep) values(@id_cliente, c_logradouro, c_rua, c_numero, c_complemento, c_bairro, c_cidade, c_estado, c_cep); IF excecao = 1 THEN SET msg = "ALERTA: Erro ao inserir na tabela de Endereco"; ROLLBACK; END IF; END IF; END IF; IF excecao <> 1 THEN COMMIT; SET msg = "ALERTA: Registro Incluido com sucesso"; END IF; SELECT msg AS msg; END$$ DELIMITER ;  
       
    • By josePeixoto
      Olá,
       
      quando tento executar a trigger abaixo, ele me retorna 
      Erro(56,16): PLS-00306: wrong number or types of arguments in call to '||'  
      create or replace TRIGGER API_SIM_PF_ATUALIZA_DENTALIS BEFORE INSERT OR UPDATE ON PESSOA_FISICA FOR EACH ROW DECLARE type t_num is table of number; DS_EMAIL_W t_num; TELEFONE_RES_W t_num; TELEFONE_COM_W t_num; ESTADO_CIVIL_W VARCHAR2(255); ENDERECO_RES_W t_num; NUMERO_W t_num; BAIRRO_RES_W t_num; COMPLEMENTO_RES_W t_num; CIDADE_RES_W t_num; CEP_RES_W t_num; ENDERECO_COM_W t_num; NUMERO_COM_W t_num; BAIRRO_COM_W t_num; COMPLEMENTO_COM_W t_num; CIDADE_COM_W t_num; CEP_COM_W t_num; PROFISSIONAL_W VARCHAR2(255); SEXO_W VARCHAR2(255); DT_NASCIMENTO_W t_num; BEGIN SELECT DISTINCT CP.DS_EMAIL, ('('||nr_ddd_telefone||')'||nr_telefone), ('('||nr_ddd_telefone||')'||nr_telefone), (SELECT CP1.DS_ENDERECO FROM COMPL_PESSOA_FISICA CP1 WHERE CP1.CD_PESSOA_FISICA = :NEW.CD_PESSOA_FISICA AND CP1.IE_TIPO_COMPLEMENTO = 1), (SELECT CP1.NR_ENDERECO FROM COMPL_PESSOA_FISICA CP1 WHERE CP1.CD_PESSOA_FISICA = :NEW.CD_PESSOA_FISICA AND CP1.IE_TIPO_COMPLEMENTO = 1), (SELECT CP1.DS_BAIRRO FROM COMPL_PESSOA_FISICA CP1 WHERE CP1.CD_PESSOA_FISICA = :NEW.CD_PESSOA_FISICA AND CP1.IE_TIPO_COMPLEMENTO = 1), (SELECT CP1.DS_COMPLEMENTO FROM COMPL_PESSOA_FISICA CP1 WHERE CP1.CD_PESSOA_FISICA = :NEW.CD_PESSOA_FISICA AND CP1.IE_TIPO_COMPLEMENTO = 1), (SELECT CP1.DS_MUNICIPIO FROM COMPL_PESSOA_FISICA CP1 WHERE CP1.CD_PESSOA_FISICA = :NEW.CD_PESSOA_FISICA AND CP1.IE_TIPO_COMPLEMENTO = 1), (SELECT CP1.CD_CEP FROM COMPL_PESSOA_FISICA CP1 WHERE CP1.CD_PESSOA_FISICA = :NEW.CD_PESSOA_FISICA AND CP1.IE_TIPO_COMPLEMENTO = 1), TO_CHAR(:NEW.DT_NASCIMENTO,'"YYYY-MM-DD HH24:MI:SS') BULK COLLECT INTO DS_EMAIL_W,TELEFONE_RES_W,TELEFONE_COM_W,ENDERECO_RES_W,NUMERO_W,BAIRRO_RES_W,COMPLEMENTO_RES_W,CIDADE_RES_W,CEP_RES_W,/*ENDERECO_COM_W,NUMERO_COM_W,BAIRRO_COM_W,COMPLEMENTO_COM_W, CIDADE_COM_W,CEP_COM_W,*/DT_NASCIMENTO_W FROM TASY.COMPL_PESSOA_FISICA CP WHERE CP.CD_PESSOA_FISICA =:NEW.CD_PESSOA_FISICA AND CP.IE_TIPO_COMPLEMENTO = 1; SELECT V.DS_VALOR_DOMINIO INTO ESTADO_CIVIL_W FROM VALOR_DOMINIO V WHERE CD_DOMINIO = 5 AND V.VL_DOMINIO = :NEW.IE_ESTADO_CIVIL; SELECT CA.DS_CARGO INTO PROFISSIONAL_W FROM CARGO CA WHERE CA.CD_CARGO = :NEW.CD_CARGO; SELECT V.DS_VALOR_DOMINIO INTO SEXO_W FROM VALOR_DOMINIO V WHERE CD_DOMINIO = 4 AND V.VL_DOMINIO = :NEW.IE_SEXO; BEGIN SEND_DB_REQUST_PROC ('http://628186fc.ngrok.io/DentalisIntegration-1.0.0/dentalis/createuser', '{ "nome":' || :NEW.NM_PESSOA_FISICA ||','|| '"codigo_externo":' || :NEW.CD_PESSOA_FISICA ||','|| '"codigo_plano":' || 694 ||','|| '"matricula":' || :NEW.CD_PESSOA_FISICA || ',' || '"cpf":' || :NEW.NR_CPF ||','|| '"rg":' || :NEW.NR_IDENTIDADE || ',' || '"email":' || DS_EMAIL_W || ',' || '"telefone_res":' || TELEFONE_RES_W ||','|| '"telefone_com":' || TELEFONE_COM_W || ',' || '"celular":' || :NEW.NR_TELEFONE_CELULAR || ',' || '"observacao":' || :NEW.DS_OBSERVACAO || ',' || '"estado_civil":' || ESTADO_CIVIL_W || ',' || '"profissao":' || PROFISSIONAL_W || ',' || '"sexo":' || SEXO_W || ',' || '"data_nascimento":' || DT_NASCIMENTO_W || ',' || '"endereco_res":' || ENDERECO_RES_W || ',' || '"numero_res":' || NUMERO_W || ',' || '"bairro_res":' || BAIRRO_RES_W || ',' || '"complemento_res":' || COMPLEMENTO_RES_W || ',' || '"cidade_res":' || CIDADE_RES_W || ',' || '"cep_res":' || CEP_RES_W || ',' || '"endereco_com": "",' || '"numero_com":"",' || '"bairro_com":"",' || '"complemento_com":"",' || '"cidade_com":"",' || '"cep_com":""' || '}'); exception when others then raise_application_error(-20000,'Erro: '|| sqlerrm); END; END;  
      Alguém sabe o que pode ser? 
       
      Obrigado desde já pela atenção!
    • By Ederson Silva
      Olá.
       
      Estou tendo problemas com uma procedure na qual dentro dela existe uma função que busca informações de um XML. Quando executo esta função dentro do Studio Management ele funciona, só que se executo no reporting service ou diretamente no ERP o SQL Server retorna o erro abaixo:
       
      Falha em SELECT porque as seguintes opções SET têm configurações incorretas:
      'ARITHBORT'. Verifique se as opções SET estão corretas para uso com exibições indexadas e/ou índices em colunas computadas e/ou índices filtrados e/ou notificações de consulta e/ou métodos de tipo de XML e/ou operações de índice espacial.
       
      Tanto na procedure quanto nas functions eu setei as seguintes options:
       
      SET ANSI_NULLS ON
      SET ANSI_PADDING ON
      SET ANSI_WARNINGS ON
      SET ARITHABORT ON
      SET CONCAT_NULL_YIELDS_NULL ON
      SET NUMERIC_ROUNDABORT OFF
      SET QUOTED_IDENTIFIER ON
       
      Se alguém tiver alguma ideia de como corrigir isso por gentileza me dê uma luz.
       
      Obrigado!
    • By bruno.291193
      Olá,
       
      Estou com a seguinte dúvida:
       
      Na criação de minha procedure, os parâmetros de Data Inicial e Final não podem vir nulos. Eu criei a verificação abaixo para isso:
      " IF @DT_INICIAL AND @DT_FINAL IS NULL BEGIN RAISERROR('ERRO = DATA INICIAL E FINAL NAO INFORMADAS.',1,1) END; "
      Porém, ao meu ver, é uma verificação desnecessária, ou seja, se eu criar os parâmetros @DT_INICIAL e @DT_FINAL como NOT NULL, o próprio SQL irá retornar o erro dizendo que o parâmetro é obrigatório.
       
      Mas, não sei como realizar a criação desses parâmetros como NOT NULL, ao realizar o código abaixo, o SQL retorna o erro (também abaixo):
      (
      DECLARE @DT_INICIAL DATE NOT NULL,
      DECLARE @DT_FINAL DATE NOT NULL
      )
      Retorno do SQL:
      Msg 11555, Level 15, State 1, Procedure PRC_MTCORP_MODU_ABAS_BOBI_QUAL_CONS, Line 29
      O parâmetro '@DATA_INICIAL' foi declarado como NOT NULL. Os parâmetros NOT NULL têm suporte apenas com procedimentos armazenados compilados de forma nativa.
       
      Pergunta:
      Existe meios de se criar o parâmetro como NOT NULL?
       
      Detalhe:
      Criando o parâmetro sem nenhuma informação, ou seja, DECLARE "@DT_INICIAL DATE", na execução o SQL aceita o parâmetro como NULL, sendo necessária minha verificação inicial.
       
      Abraço.
       
×

Important Information

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