Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Não é possível iniciar nova transação pois o limite foi ex


Paulo H Grando

Pergunta

3 respostass a esta questão

Posts Recomendados

  • 0

Bom dia Paulo,

Quando ocorre um problema destes, as variáveis podem ser infinitas. Para isto, temos que levar em consideração alguns pontos. O mais importante é identificar o que de "diferente" ocorreu (pois o sistema não apresentava este problema).

Seria interessante você fazer algumas verificações:

- Verificar a(s) tabela(a) que o aplicativo está manipulando. Identifique se sua estrutura está íntegra e não há problemas de acesso.

- Verifique os processos na Base. Como é um problema que não existia, pode estar relacionado com processos pesados ou processos "travando" a Base.

- Verifique a quantidade de acessos e processos simultâneos ocorridos no decorrer do problema.

- Verifique a rede.

Se a tabela possui muita manipulação (inserção e exclusão), pode-se recriar os índices. Faça um Plano de Manutenção: http://msdn.microsoft.com/pt-br/library/ms189953.aspx

Quando o problema não é corriqueiro, deve-se identificar algum "acontecimento novo" para direcionar a correção.

O processo de "limite excedido" pode estar relacionado com a configuração do aplicativo. Caso a configuração de TimeOut esteja muito baixo e o processo "pesado", pode ser abortado.

O processo pode estar relacionado com a configuração de TimeOut do Sql. Neste caso, pode-se acessar:

- Management Studio

- Botão direito em cima do nome do Servidor

- Propriedades

- Opção Connections (esquerda)

- Na opção "Remote Server Connections", você pode colocar quantos segundos para a query ser abortada.

Pelo que explicou, creio que seja um problema pontual na tabela. A mensagem de "limite excedido" é visualizada APENAS ao salvar novas solicitações? Se for, seu foco será na(s) tabela(s) manipulada(s) e no processo de gravação.

Qualquer dúvida, posta aí!!! :.)

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado pela ajuda, mas o problema era no Delphi mesmo. O componente de acesso a dados tem uma limitação com o SQL Server. É necessário incluir uma instrução para lidar com isso.

Segue abaixo o texto original:

* When using dbExpress MSSQL and TClientDataSet.ApplyUpdates,

you may encounter either of the following errors while

applying updates, due to a SQLOLEDB.DLL limitation:

"Cannot create new transaction because capacity was exceeded."

"Cannot create new connection because in manual or

distributed transaction mode."

To resolve the errors, use one of the following workarounds:

- On the DataSetProvider Options property, make sure

poFetchBlobsOnDemand and poFetchDetailsOnDemand are False.

- Use a BeforeApplyUpdates event to either call CloseDataSets

or Close the connection:

procedure TForm1.DataSetProvider1BeforeApplyUpdates(Sender: TObject;

var OwnerData: OleVariant);

begin

SQLConnection1.CloseDataSets;

// SQLConnection1.Close;

end;

Link para o comentário
Compartilhar em outros sites

  • 0
Obrigado pela ajuda, mas o problema era no Delphi mesmo. O componente de acesso a dados tem uma limitação com o SQL Server. É necessário incluir uma instrução para lidar com isso.

Segue abaixo o texto original:

* When using dbExpress MSSQL and TClientDataSet.ApplyUpdates,

you may encounter either of the following errors while

applying updates, due to a SQLOLEDB.DLL limitation:

"Cannot create new transaction because capacity was exceeded."

"Cannot create new connection because in manual or

distributed transaction mode."

To resolve the errors, use one of the following workarounds:

- On the DataSetProvider Options property, make sure

poFetchBlobsOnDemand and poFetchDetailsOnDemand are False.

- Use a BeforeApplyUpdates event to either call CloseDataSets

or Close the connection:

procedure TForm1.DataSetProvider1BeforeApplyUpdates(Sender: TObject;

var OwnerData: OleVariant);

begin

SQLConnection1.CloseDataSets;

// SQLConnection1.Close;

end;

Da maneira a cima pode dar certo sim, mas se você estiver trabalhando com controle de transações manualmente, é só fechar os Datasets e Clients, depois limpar os datasets no SqlConection e efetuar o controle de transações:

SQLDataSet1.Close;

ClientDataSet1.Close;

SQLDataset2.Close;

ClientDataSet2.Close

SQLConnection1.CloseDataSets;

//Efetuar o controle manual de transações

Randomize;

idTRansacao:=Random(100000);

Transacao.TransactionID:= idTransacao;

Transacao.IsolationLevel:= xilREADCOMMITTED;

SQLConnection1.StartTransaction(Transacao);

// Abrir os Clients (Se estiver usando transações manuais lembre-se de nunca abrir os DataSets após as intruções sql)

SqlDataSet1.CommandText:=' select ... ';

SqlDataSet1.Params[0].AsString:= ... ;

ClientDataSet1.Open;

SqlDataSet2.CommandText:=' select ... ';

SqlDataSet2.Params[0].AsString:= ... ;

ClientDataSet2.Open;

* Obs.: Na hora de salvar, é só aplicar os ApplyUpdates e em seguida: SQLConnection1.Commit(Transacao); (qualquer coisa pesquise sobre transações manuais).

Abraços.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...