Fórum Transação ADOConnection #364688

06/10/2008

0

Utilizo SQL Server e ao iniciar uma transação: dmConexao.conexao.BeginTrans;
faço insert em outra tabela: dmDados.EMPRESA_SETOR.Insert;

Acontece que neste momento se for tentar fazer um select na tabela EMPRESA_SETOR
a mesma estará travada, travando todo o sistema, ou seja, nem um simples select funciona...

Alguém saberia me informar como solucionar isto?
Grato,
Lex.


Buenolex

Buenolex

Responder

Posts

06/10/2008

Discorpio

Boa noite Buenolex.

Não era pra menos.

Jamais voce deve fazer Select e Insert ao mesmo tempo na mesma tabela (EMPRESA_SETOR). Pelo menos foi o que voce informou no seu Post.

Quando voce aciona um Insert em uma tabela, o comando abre a tabela e cria uma estrutura de registro em branco na posição onde estiver o ponteiro da tabela. Exemplo: se o ponteiro da tabela estiver no registro de número 25, a estrutura nova é criada entre o registro 24 e o 25, já o comando Append, abre essa estrutura no final da tabela.

Neste momento, o sistema aguarda que voce insira algum registro, se voce acionar uma Sql de Seleção (Select), haverá movimentação nos registros da tabela, e aquela estrutura de registro aberto vai para as cucuias, e muitas das vezes, isso corrompe até os registros físicos da tabela, não é para menos que o sistema trava.

Se voce pretende, antes de inserir qualquer registro, verificar se ele já existe dentro de sua tabela, acione antes a SQL de Seleção (Select), em caso de registro encontrado, informe ao usuário e pronto, em caso de registro não encontrado, ai sim voce aciona o Insert.


Responder

Gostei + 0

07/10/2008

Ara.es

Acho que vc deve procurar algo relacionado a [b:5501752017]IsolationLevel[/b:5501752017], sei que é isso que define o que será visto na tabela, se os dados inseridos e não comitados, ou somente os dados comitados.


Responder

Gostei + 0

07/10/2008

Ara.es

Não tive tempo de ler por completo, mas tem algo a respeito do que falei nesses links: olhe ai:

[url]http://delphi.about.com/od/database/l/aa010202a.htm[/url]
[url]http://www.mail-archive.com/delphi-br@yahoogrupos.com.br/msg25419.html[/url]

Qualquer coise é só falar. flw ate mais.


Responder

Gostei + 0

07/10/2008

Buenolex

Obrigado pessoal, fiz de uma forma que não necessita de transação e controlo com uma tabela temporária... Estilo bem parecido da forma que faço quando desenvolvo em ASP para web... Funciona :)
Lex.


Responder

Gostei + 0

08/10/2008

Discorpio

Boa noite a todos.

Pessoal, será que eu entendi errado.

faço insert em outra tabela: [color=blue:c527c98e91]dmDados.EMPRESA_SETOR.Insert;[/color:c527c98e91] Acontece que neste momento se for tentar fazer um [color=red:c527c98e91]select na tabela EMPRESA_SETOR [/color:c527c98e91]


Ou será que alguém não percebeu.

Fazer um Insert e logo em seguida um Select na mesma tabela, isto é um erro inreparável, a não ser que voce realize a sequência abaixo:

1º) Inicia a transação dmDados.Conexao.BeginTrans.

2º) Aciona DmDados.Empresa_Setor.Insert.

3º) Insere os Dados no DataSet, pois vejo que voce está usando um componente com um DataSet local.

4º) Salva os registros acionando o dmDados.Empresa_Setor.Post.

5º) Aciona o dmDados.Conexao.CommitTrans.

6º) Verifica se foi feito a transação sem erro, se não dmDados.Conexao.RollBackTrans.

7º) Inicia a transação novamente, pois o Commit fecha a transação, então dmDados.Conexao.BeginTrans

8º) Ai sim, voce aciona o Select e carrega os registros para o DataSet Local com Select.

Bom se for assim que voce está realizando as suas regras de negócio, então me desculpe o meu post anterior.


Responder

Gostei + 0

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

Aceitar