2

私はこのコードを2つの別々のスレッドで並行して実行しています。数回は正常に動作しますが、ランダムな時点で InvalidOperationException がスローされます。

トランザクションは現在の接続に関連付けられていないか、完了しています。

例外が発生した時点で、ビジュアル スタジオを使用してトランザクションの内部を調べ、その接続が正常に設定されていることを確認します。また、command.Transaction._internalTransaction. _transactionState は Active に設定され、IsZombied プロパティは false に設定されます。

これはテスト アプリケーションであり、より長いトランザクションを作成してオーバーラップを引き起こすために Thread.Sleep を使用しています。

例外がスローされるのはなぜですか? また、それに対して何ができますか?

IDbCommand command = new SqlCommand("Select * From INFO");
IDbConnection connection = new SqlConnection(connectionString);
command.Connection = connection;
IDbTransaction transaction = null;
try
{
    connection.Open();
    transaction = connection.BeginTransaction();
    command.Transaction = transaction;
    command.ExecuteNonQuery(); // Sometimes throws exception
    Thread.Sleep(forawhile); // For overlapping transactions running in parallel
    transaction.Commit();
}
catch (ApplicationException exception)
{
    if (transaction != null)
    {
        transaction.Rollback();
    }
}
finally
{
    connection.Close();
}
4

1 に答える 1

2

解決策を見つけました。これを呼び出すことがわかりました

command.Connection = connection;

コマンドへの接続を設定するという意味ではありません。これを呼び出した直後に、の結果を確認しました

command.Connection.GetHashCode();
command.GetHashCode();

そして彼らは平等ではありませんでした。connection.CreateCommand を使用するようにコードをリファクタリングし、問題を解決しました。

于 2009-01-14T15:14:48.023 に答える