Transação ADOConnection
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.
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
Curtidas 0
Respostas
Discorpio
06/10/2008
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.
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.
GOSTEI 0
Ara.es
06/10/2008
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.
GOSTEI 0
Ara.es
06/10/2008
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.
[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.
GOSTEI 0
Buenolex
06/10/2008
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.
Lex.
GOSTEI 0
Discorpio
06/10/2008
Boa noite a todos.
Pessoal, será que eu entendi errado.
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.
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.
GOSTEI 0