80 votes

Erreur « L'opération n'est pas valide pour l'état de la transaction » et périmètre de la transaction

J'obtiens l'erreur suivante lorsque j'essaie d'appeler une procédure stockée qui contient une instruction SELECT :

L'opération n'est pas valide pour l'état de la transaction

Voici la structure de mes appels :

public void MyAddUpdateMethod()
{

    using (TransactionScope Scope = new TransactionScope(TransactionScopeOption.RequiresNew))
    {
        using(SQLServer Sql = new SQLServer(this.m_connstring))
        {
            //do my first add update statement

            //do my call to the select statement sp
            bool DoesRecordExist = this.SelectStatementCall(id)
        }
    }
}

public bool SelectStatementCall(System.Guid id)
{
    using(SQLServer Sql = new SQLServer(this.m_connstring)) //breaks on this line
    {
        //create parameters
        //
    }
}

Le problème est-il que je crée une autre connexion à la même base de données dans la transaction ?

66voto

Michael Kniskern Points 7276

Après avoir fait quelques recherches, il semble que je ne puisse pas avoir deux connexions ouvertes à la même base de données avec le bloc TransactionScope. J'avais besoin de modifier mon code pour ressembler à ceci :

public void MyAddUpdateMethod()
{
    using (TransactionScope Scope = new TransactionScope(TransactionScopeOption.RequiresNew))
    {
        using(SQLServer Sql = new SQLServer(this.m_connstring))
        {
            //do my first add update statement            
        }

        //removed the method call from the first sql server using statement
        bool DoesRecordExist = this.SelectStatementCall(id)
    }
}

public bool SelectStatementCall(System.Guid id)
{
    using(SQLServer Sql = new SQLServer(this.m_connstring))
    {
        //create parameters
    }
}

16voto

R. Schreurs Points 952

Lorsque j'ai rencontré cette exception, il y avait une ExceptionIntérieure "Délai de Transaction". Comme c'était lors d'une session de débogage, lorsque j'ai arrêté mon code pendant un certain temps à l'intérieur de TransactionScope, j'ai choisi d'ignorer ce problème.

Lorsque cette exception spécifique avec un délai d'attente apparaît dans le code déployé, je pense que la section suivante dans votre fichier .config vous aidera :

<system.transactions> 
        <machineSettings maxTimeout="00:05:00" /> 
</system.transactions>

13voto

Sharique Points 1948

Je rencontre également le même problème, j'ai changé le délai de transaction à 15 minutes et cela fonctionne. J'espère que cela aidera.

TransactionOptions options = new TransactionOptions();
options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
options.Timeout = new TimeSpan(0, 15, 0);
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required,options))
{
    sp1();
    sp2();
    ...

}

5voto

Wyatt Points 1131

J'ai rencontré cette erreur lorsque ma Transaction est imbriquée dans une autre. Est-il possible que la procédure stockée déclare sa propre transaction ou que la fonction appelante en déclare une ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X