私はこのコードを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();
}