14

アプリケーションで次のエラーが発生しました。

このSQLTransactionは完了しました。使用できなくなりました

スタックトレースは以下に添付されています–それはとについて述べていZombie CheckますRollback

コードの間違いは何ですか?

注:このエラーは1回だけ発生しました。

アップデート

MSDNから-SqlTransaction.Rollbackメソッド

接続が終了した場合、またはトランザクションがサーバー上ですでにロールバックされている場合、ロールバックはInvalidOperationExceptionを生成します。

トランザクションのゾンビチェックから-エラー

このエラーがさまざまなアプリケーションで表示されるのを私が見た最も頻繁な理由の1つは、アプリケーション間でSqlConnectionを共有することです。

コード

public int SaveUserLogOnInfo(int empID)
{
        int? sessionID = null;
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            SqlTransaction transaction = null;
            try
            {
                transaction = connection.BeginTransaction();
                sessionID = GetSessionIDForAssociate(connection, empID, transaction);

                    //Other Code

                //Commit
                transaction.Commit();
            }
            catch
            {
                //Rollback
                if (transaction != null)
                {
                    transaction.Rollback();
                    transaction.Dispose();
                    transaction = null;
                }

                //Throw exception
                throw;
            }
            finally
            {
                if (transaction != null)
                {
                    transaction.Dispose();
                }
            }
        }

        return Convert.ToInt32(sessionID,CultureInfo.InvariantCulture);

   }

スタックトレース

ここに画像の説明を入力してください


参照

  1. ゾンビトランザクションとは何ですか?
  2. トランザクションのゾンビチェック-エラー
  3. SqlTransactionが完了しました
  4. http://forums.asp.net/t/1579684.aspx/1
  5. 「このSqlTransactionは完了しました。使用できなくなりました。」...構成エラー?
  6. dotnet.sys-con.com-SqlClient接続プールが公開されました
  7. スレッドアボートはゾンビトランザクションと壊れたSqlConnectionを残します

4

5 に答える 5

8

作業の一部はコンパイラに任せて、//でラップするtry必要がありcatchますfinally

また、ステージで問題が発生した場合、またはサーバーへの接続が切断されたRollback場合に、例外がスローされることがあることを予期する必要があります。Commitそのため、try/でラップする必要がありますcatch

try
{
    transaction.Rollback();
}
catch (Exception ex2)
{
    // This catch block will handle any errors that may have occurred 
    // on the server that would cause the rollback to fail, such as 
    // a closed connection.
    Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
    Console.WriteLine("  Message: {0}", ex2.Message);
}

これは、RollbackメソッドのMSDNドキュメントページから正確にコピーされています。

ゾンビ取引があるのではないかと心配しているようです。貼り付けた場合、問題ないようです。トランザクションは完了しました。これとは何の関係もありません。あなたがそれらを保持している場合はそれへの参照を削除し、それを忘れてください。


MSDNから-SqlTransaction.Rollbackメソッド

接続が終了した場合、またはトランザクションがサーバー上ですでにロールバックされている場合、ロールバックはInvalidOperationExceptionを生成します。

新しい例外を再スローして、データが保存されていない可能性があることをユーザーに通知し、更新して確認するようにユーザーに依頼します

于 2013-03-08T12:18:02.873 に答える
7

注:このエラーは1回だけ発生しました。

それなら多くを言うのは非常に難しいです。// Other Code単純に、などが単に時間がかかり、すべてが殺されたということかもしれません。接続が切断されたか、ブロックしていたために管理者が意図的に接続を切断した可能性があります。

コードの間違いは何ですか?

それを過度に複雑にします。それははるかに簡単にすることができます:

using (var connection = new SqlConnection(connectionString))
{
    connection.Open();
    using(var transaction = connection.BeginTransaction())
    {
        try
        {
            sessionID = GetSessionIDForAssociate(connection, empID, transaction);
            //Other Code
            transaction.Commit();
         }
         catch
         {
            transaction.Rollback();
            throw;
         }
    }
}

間違えるコードははるかに少ない。

于 2013-03-08T12:12:57.053 に答える
1
于 2016-05-30T15:05:27.427 に答える