Vários Inserts Transação ficou muito pesada
07/12/2015
0
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
Posts
07/12/2015
Marcos P
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;
07/12/2015
Diogo Resmer
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.
07/12/2015
Marcos P
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.
Clique aqui para fazer login e interagir na Comunidade :)