it-swarm.com.de

"Die Operation ist nicht gültig für den Status der Transaktion" Fehler und Transaktionsbereich

Wenn ich versuche, eine gespeicherte Prozedur aufzurufen, die eine SELECT-Anweisung enthält, wird folgende Fehlermeldung angezeigt:

Die Operation ist für den Status der Transaktion nicht gültig

Hier ist die Struktur meiner Anrufe:

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
        //
    }
}

Tritt das Problem auf, dass innerhalb der Transaktion eine weitere Verbindung zur gleichen Datenbank hergestellt wird?

50

Nach einigen Recherchen scheint es mir nicht möglich zu sein, dass zwei Verbindungen zu derselben Datenbank mit dem TransactionScope-Block geöffnet werden. Ich musste meinen Code so ändern, dass er folgendermaßen aussieht:

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
    }
}
47

Ich habe auch das gleiche Problem, ich habe das Transaktionszeitlimit auf 15 Minuten geändert und es funktioniert. Ich hoffe das hilft.

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();
    ...

}
8
Sharique

Als ich auf diese Ausnahme stieß, gab es eine InnerException "Transaction Timeout". Da dies während einer Debug-Sitzung der Fall war, als ich meinen Code einige Zeit im TransactionScope angehalten hatte, entschied ich mich, dieses Problem zu ignorieren.

Wenn diese bestimmte Ausnahme mit einem Timeout im bereitgestellten Code angezeigt wird, denke ich, dass der folgende Abschnitt in Ihrer .config-Datei Ihnen helfen wird:

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

Dieser Fehler ist aufgetreten, wenn meine Transaktion in einer anderen verschachtelt ist. Ist es möglich, dass die gespeicherte Prozedur ihre eigene Transaktion deklariert oder dass die aufrufende Funktion eine deklariert?

2
Wyatt

Dieser Fehler trat für mich auf, als ich versuchte, einen Transaktionsblock rückgängig zu machen, nachdem in einem anderen Transaktionsblock eine Ausnahme aufgetreten war.

Alles, was ich tun musste, um das Problem zu beheben, bestand darin, meine innere Transaktionssperre zu entfernen.

Die Verwendung verschachtelter Transaktionen kann unübersichtlich werden, am besten vermeiden Sie dies und strukturieren Sie Ihren Code einfach um.

0
Vishav Premlall