GARANTIR DESCONTO

Fórum deadlock ...não sei o que faço agora... #337762

13/02/2007

0

Bom colegas,

desenvolvi um sistema client/server mas quando os usuarios tentam alterar os dados de uma mesma tabela da erro de ´deadlock´.

Como poderei evitar isso?

estou usando assim no campo salvar:
if not validaCampos then Exit; case strOper of ´I´: begin with DmProcesso.SQLSProc_USUARIO_INS do begin Close; ParamByName(´NOME_USU´).AsString := EditNomeUsuario.Text; ParamByName(´SENHA_USU´).AsString := EditSenhaUsuario.Text; try ExecProc; except on E : Exception do begin MessageDlg(E.Message, mtError, [mbOk], 0); Abort; end; end; end; end; ´A´: begin with DmProcesso.SQLSProc_USUARIO_UPD do begin Close; ParamByName(´COD_USU´).AsInteger := DSConsulta.DataSet.FieldByName(´USU_COD´).AsInteger; ParamByName(´NOME_USU´).AsString := EditNomeUsuario.Text; ParamByName(´SENHA_USU´).AsString := EditSenhaUsuario.Text; try ExecProc; except on E : Exception do begin MessageDlg(E.Message, mtError, [mbOk], 0); Abort; end; end; end; end;



Erivando

Erivando

Responder

Posts

13/02/2007

Erivando

Bom colegas, desenvolvi um sistema client/server mas quando os usuarios tentam alterar os dados de uma mesma tabela da erro de ´deadlock´. Como poderei evitar isso? estou usando assim no campo salvar: [quote:2195feba98] if not validaCampos then Exit; case strOper of ´I´: begin with DmProcesso.SQLSProc_USUARIO_INS do begin Close; ParamByName(´NOME_USU´).AsString := EditNomeUsuario.Text; ParamByName(´SENHA_USU´).AsString := EditSenhaUsuario.Text; try ExecProc; except on E : Exception do begin MessageDlg(E.Message, mtError, [mbOk], 0); Abort; end; end; end; end; ´A´: begin with DmProcesso.SQLSProc_USUARIO_UPD do begin Close; ParamByName(´COD_USU´).AsInteger := DSConsulta.DataSet.FieldByName(´USU_COD´).AsInteger; ParamByName(´NOME_USU´).AsString := EditNomeUsuario.Text; ParamByName(´SENHA_USU´).AsString := EditSenhaUsuario.Text; try ExecProc; except on E : Exception do begin MessageDlg(E.Message, mtError, [mbOk], 0); Abort; end; end; end; end;
[/quote:2195feba98]


esqueci de informar que estou usando DbExpress com trio de componetes e acesso dbexpress com o driver especifico UIB FireBird 1.5


Responder

Gostei + 0

13/02/2007

Sremulador

Amigo não vi seu tratamento de gravação na base...


Responder

Gostei + 0

14/02/2007

Erivando

... with DmProcesso.SQLSProc_USUARIO_INS do begin Close; ParamByName(´NOME_USU´).AsString := EditNomeUsuario.Text; ParamByName(´SENHA_USU´).AsString := EditSenhaUsuario.Text; try ExecProc; <====== mas o tratamento na base que o colega se refere não irá acontecer neste ponto, através da execução da Stored Procedure ??? daí o firebird faz o resto, colega sremulador. ......



Responder

Gostei + 0

14/02/2007

Sremulador

ExecProc; <====== mas o tratamento na base que o colega se refere não irá acontecer neste ponto, através da execução da Stored Procedure ??? daí o firebird faz o resto, colega sremulador.


você poderia postar os detalhes do [b:c074054410]ExecProc[/b:c074054410]


Responder

Gostei + 0

14/02/2007

Erivando

Estou usando a seguinte SP no FireBird 1.5

CREATE PROCEDURE PROC_INS_USUARIO ( nome_usu varchar(70), senha_usu varchar(50)) as BEGIN INSERT INTO USUARIO (USU_NOME, USU_SENHA) VALUES (:NOME_USU, :SENHA_USU); END


no datamodule estou usando

SQLConnection -> SQLDataSet -> DataSetProvider -> ClientDataSet -> DataSource


SQLStoredProc <ligado a procedure> PROC_INS_USUARIO

código referente a ´SQLStoredProc´ do botão salvar (insert ou update dos dados no banco)


procedure TFrmUsuarios.BtnSalvarClick(Sender: TObject); begin if not validaCampos then Exit; case strOper of ´I´: begin //Verifica se já existe um registro com o mesmo valor with DmConsulta.CDSConsulta do begin Close; CommandText:= ´SELECT count(1) FROM USUARIO WHERE USU_NOME = ´ + QuotedStr(AnsiUpperCase(EditNomeUsuario.Text)); Open; if Fields[0].AsInteger <> 0 then begin MessageDlg(´Usuário já cadastrado no sistema!´ + #13 + ´Informe outro nome.´, mtInformation, [mbOk], 0); EditNomeUsuario.SetFocus; Exit; end else end; with DmProcesso.SQLSProc_USUARIO_INS do begin Close; ParamByName(´NOME_USU´).AsString := EditNomeUsuario.Text; ParamByName(´SENHA_USU´).AsString := EditSenhaUsuario.Text; try ExecProc; except on E : Exception do begin MessageDlg(E.Message, mtError, [mbOk], 0); Abort; end; end; end; end; ´A´: begin //Verifica se houve mudança no campo if Trim(EditNomeUsuario.Text) <> DmConsulta.CDSConsulta.FieldByName(´USU_NOME´).AsString then begin //Verifica se já existe um registro com o mesmo valor with DmConsulta.CDSConsulta do begin Close; CommandText:= ´SELECT count(1) FROM USUARIO WHERE USU_NOME = ´ + QuotedStr(AnsiUpperCase(EditNomeUsuario.Text)); Open; if Fields[0].AsInteger <> 0 then begin MessageDlg(´Usuário já cadastrado no sistema!´ + #13 + ´Informe outro nome.´, mtInformation, [mbOk], 0); EditNomeUsuario.SetFocus; Exit; end else end; end else if ConfirmaSenha(Senha) then if Senha <> DmConsulta.CDSConsulta.FieldByName(´USU_SENHA´).AsString then begin MessageDlg(´Senha não confere.´ + 13 + ´Repita a operação e tente novamente!´, mtInformation, [mbOk], 0); Exit; end else with DmProcesso.SQLSProc_USUARIO_UPD do begin Close; ParamByName(´COD_USU´).AsInteger := DSConsulta.DataSet.FieldByName(´USU_COD´).AsInteger; ParamByName(´NOME_USU´).AsString := EditNomeUsuario.Text; ParamByName(´SENHA_USU´).AsString := EditSenhaUsuario.Text; try ExecProc; except on E : Exception do begin MessageDlg(E.Message, mtError, [mbOk], 0); Abort; end; end; end; end; end; strOper := ´C´; if DSConsulta.DataSet.Active then DmConsulta.CDSConsulta.Refresh; DSConsulta.DataSet.Close; limpaCampos; habilitaBotoes(strOper); habilitaCampos(False); end;



O que estar acontecendo agora é que quando não dar erro de ´deadlock´ salva os dados repetidos no banco (quando salvos no mesmo momento) , mas se um usuario salvar algo e em alguns segundos um outro usuario tentar a mesma informação ai o sistema ja consegue detectar que ja existe um cadadtrado, quando não cadastra a mesma informação repetidamente.

O que poderá estar faltando? estou quase lá!!!


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar