web-dev-qa-db-ja.com

「操作はトランザクションの状態に対して無効です」エラーおよびトランザクションスコープ

SELECTステートメントを含むストアドプロシージャを呼び出そうとすると、次のエラーが表示されます。

操作はトランザクションの状態に対して無効です

これが私の呼び出しの構造です:

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

トランザクション内で同じデータベースへの別の接続を作成することに関する問題はありますか?

55

いくつかの調査を行った後、TransactionScopeブロックで同じデータベースへの2つの接続を開くことができないようです。次のようにコードを変更する必要がありました。

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

また、同じ問題に遭遇しました。トランザクションタイムアウトを15分に変更しましたが、動作します。これがお役に立てば幸いです。

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

}
9
Sharique

この例外が発生したときに、InnerExceptionの「トランザクションタイムアウト」が発生しました。これはデバッグセッション中だったため、TransactionScope内でしばらくコードを停止したときに、この問題を無視することにしました。

デプロイされたコードにタイムアウトを伴うこの特定の例外が表示される場合、.configファイルの次のセクションが役立つと思います。

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

トランザクションが別のトランザクション内にネストされているときにこのエラーが発生しました。ストアドプロシージャが独自のトランザクションを宣言することや、呼び出し元の関数がトランザクションを宣言することは可能ですか?

3
Wyatt

私にとって、このエラーは、別のトランザクションブロック内で例外が発生した後にトランザクションブロックをロールバックしようとしたときに発生しました。

それを修正するためにしなければならなかったのは、内部トランザクションブロックを削除することだけでした。

ネストされたトランザクションを使用すると、事態が非常に煩雑になる可能性があります。これを回避し、コードを再構築するのが最善です。

1
Vishav Premlall