Vários Inserts Transação ficou muito pesada

Delphi

07/12/2015

Olá pessoal,
Não sei se é a forma correta, mas criei uma aplicação que integra 3 bancos de dados diferentes e tem que fazer insert em 12 tabelas, o meu código funciona blz, mas notei que o banco de dados ficou lento, uso o banco SQLServer e componente de conexão ADOconetion.
Abaixo segue código:


dmConexao.ADOSQL1.BeginTrans;
dmConexao.ADOSQL2.BeginTrans;
dmConexao.ADOSQL3.BeginTrans;
try
BANCO1INSERT1;
BANCO1INSERT2;
BANCO1INSERT3;
BANCO2INSERT4;
BANCO2INSERT5;
BANCO2INSERT6;
BANCO3INSERT7;
BANCO3INSERT8;
BANCO3INSERT9;
BANCO3INSERT10;
BANCO1INSERT11;
BANCO1INSERT12;

dmConexao.ADOSQL1.CommitTrans;
dmConexao.ADOSQL2.CommitTrans;
dmConexao.ADOSQL3.CommitTrans;
except on e : exception do
begin
dmConexao.ADOSQL1.RollbackTrans;
dmConexao.ADOSQL2.RollbackTrans;
dmConexao.ADOSQL3.RollbackTrans;
Application.MessageBox(pchar('Erro de Transação! Processo cancelado! Erro ->' + e.Message + '<-'), 'Erro de Transação!', MB_ICONERROR);
Exit;
end;
end;
Diogo Resmer

Diogo Resmer

Curtidas 0

Respostas

Marcos P

Marcos P

07/12/2015

Sempre que inserir código no post use a tag "Inserir Código"... isso facilita, em muito, a leitura !

As transações precisam ser iniciadas todas juntas ?

Por que você não trabalha com elas separadamente, já que são bancos diferentes...

// transação no BD1
dmConexao.ADOSQL1.BeginTrans; 
try 
  BANCO1INSERT1; 
  BANCO1INSERT2; 
  BANCO1INSERT3; 
  BANCO2INSERT4; 

  dmConexao.ADOSQL1.CommitTrans; 

except on e : exception do 
begin 
  dmConexao.ADOSQL1.RollbackTrans; 
  Application.MessageBox(pchar('Erro de Transação! Processo cancelado! Erro ->' + e.Message + '<-'), 'Erro de Transação!', MB_ICONERROR); 
  Exit; 
end; 

// transação no BD2
dmConexao.ADOSQL2.BeginTrans; 
try 
  BANCO1INSERT5; 
  BANCO1INSERT6; 
  BANCO1INSERT7; 
  BANCO2INSERT8; 

  dmConexao.ADOSQL2.CommitTrans; 

except on e : exception do 
begin 
  dmConexao.ADOSQL2.RollbackTrans; 
  Application.MessageBox(pchar('Erro de Transação! Processo cancelado! Erro ->' + e.Message + '<-'), 'Erro de Transação!', MB_ICONERROR); 
  Exit; 
end; 

// transação no BD3
dmConexao.ADOSQL3.BeginTrans; 
try 
  BANCO1INSERT9; 
  BANCO1INSERT10; 
  BANCO1INSERT11; 
  BANCO2INSERT12; 

  dmConexao.ADOSQL3.CommitTrans; 

except on e : exception do 
begin 
  dmConexao.ADOSQL3.RollbackTrans; 
  Application.MessageBox(pchar('Erro de Transação! Processo cancelado! Erro ->' + e.Message + '<-'), 'Erro de Transação!', MB_ICONERROR); 
  Exit; 
end; 
GOSTEI 0
Diogo Resmer

Diogo Resmer

07/12/2015

Olá Marcos,
Desculpe aí por esquecer da tag, o problema de eu iniciar e finalizar a transação a cada banco de dados é no caso de um erro em alguns desses inserts, caso de algum erro quero voltar todas as transações.
No exemplo que me passou acho que se estiver fazendo os inserts no terceiro banco e der erro o que foi feto no banco de dados 1 e 2 já foram gravados.
GOSTEI 0
Marcos P

Marcos P

07/12/2015

Sim... ao efetuar um rollback na terceira transação as outras duas já foram efetivadas.

Faça dois testes simples, apenas para medir a performance :

1. Os inserts sem transação
2. Os inserts com as transações separadas ( como eu propus acima )

Se a performance for muito superior ao seu ambiente com as transações aninhadas, você pode concluir que o problema é do teu esquema de transações.

Se, por outro lado, a performance continuar ruim... seu problema é nos inserts.
GOSTEI 0
POSTAR