“L'opération n'est pas valide pour l'état de la transaction”, d'erreur et de l'étendue de la transaction
Je reçois le message d'erreur suivant 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
//
}
}
Est le problème avec moi, la création d'une nouvelle connexion à la base de données au sein de la transaction?
Vous devez vous connecter pour publier un commentaire.
Après avoir fait quelques recherches, il semble que je ne peut pas avoir deux connexions ouvertes à la même base de données avec le bloc TransactionScope. J'ai dû modifier mon code ressemble à ceci:
J'ai aussi trouver le même problème, j'ai changé de délai d'expiration de transaction à 15 minutes et il fonctionne.
J'espère que cette aide.
Quand j'ai rencontré cette exception, il y avait une InnerException "Délai d'expiration de Transaction". Puisque c'est au cours d'une session de débogage, quand j'ai arrêté mon code pour un certain temps à l'intérieur de la TransactionScope, j'ai choisi d'ignorer cette question.
Lorsque cette exception spécifique avec un délai d'attente s'affiche dans déployés code, je pense que la section suivante en vous .fichier de configuration va vous aider:
TransactionOptions.Timeout
?J'ai rencontré cette erreur lors de 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 d'appel déclare l'un?
Pour moi, cette erreur est venu quand j'ai essayé la restauration d'une transaction de bloc après la survenue d'une exception, à l'intérieur d'une transaction de bloc.
Tout ce que j'avais à faire était de supprimer mon intérieur transaction de bloc.
Les choses peuvent devenir assez bordélique lors de l'utilisation de transactions imbriquées, le mieux pour éviter cela et juste restructurer votre code.