Transação interrompida entre Delphi 6 e SQL Server 2005

13/11/2006

0

Olá pessoal,

Estou com um problema estranho, e não tenho idéia ainda de como resolver, por isso peço ajuda de vocês aqui do fórum. É o seguinte:

Tenho um software desenvolvido em Delphi 6, conectando a uma base de dados SQL 2005 (porém, com nível de compatibilidade de SQL 2000), através da BDE. Ele realiza diversas operações, e o problema é quando vou tentar inserir uma linha em uma tabela ´grande´ (aprox. 2 milhões de registros e umas 20 colunas).

Esta inserção está dentro de uma transação, portanto, se ela falhar, o procedimento comum é o banco de dados dar o erro de PK e eu tratar isso no [i:a3d2c9bbaa]except[/i:a3d2c9bbaa] do [i:a3d2c9bbaa]try[/i:a3d2c9bbaa] que coloquei junto à inserção. Quando eu vou tratar o erro, faço mais alguns procedimentos de banco de dados ([i:a3d2c9bbaa]inserts[/i:a3d2c9bbaa]) e depois vou ´commitar´ minha transação.

Ao ´commitar´, o Delphi me diz que não existe transação ativa, apesar de a flag [i:a3d2c9bbaa]InTransaction[/i:a3d2c9bbaa] de meu componente Database estar [i:a3d2c9bbaa]True[/i:a3d2c9bbaa].

Agora o mais louco: se eu troco o trecho de código que faz a inserção de dados na tabela grande, gerando erro de PK, por outro código que faz alguma inserção simples em uma tabela pequena, também gerando erro de PK, tudo funciona. Obviamente ele não consegue inserir o registro, mas as rotinas que faço no [i:a3d2c9bbaa]except[/i:a3d2c9bbaa] são executadas tranquilamente, e consigo ´commitar´ a transação.

Alguém já teve problema parecido? O que posso tentar? Alguma sugestão / solução :?: :?: :?:


Obrigado!,
Eduardo


Responder

Posts

14/11/2006

Ramms

Amigo creio que esse problema seja do Delphi, já que vc abre transação no seu componente, não no SQL Server, pergunte na área de Delphi que poderá ter mais respostas.


Responder

14/11/2006

Duw

Na verdade achei o problema pesquisando mais sobre SQL Server. O erro acontece pois tenho uma trigger INSTEAD OF na tabela grande, e é nela que tenho o INSERT propriamente dito.

Quando o SQL Server roda a trigger e gera o erro de FK, ele dá rollback em uma transação implícita criada por ele mesmo para a trigger, e, segundo a documentação, deveria ser só isso.

Mas na prática ele está dando rollback também na transação que iniciei via o aplicativo, deixando ele em um estado inconsistente. Vou tentar mudar a trigger para AFTER INSERT, e ver se consigo resolver assim...

Abraço,
Eduardo


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar