SQL Server と並行して C# の学習の初期段階を無事に終えた後、私が使用したさまざまなチュートリアルでは、 global やさらには変数を宣言することで、単に間違っていることに気付きSqlConnection
ましSqlDataAdapter
たDataSet
。
結果として、このコードはシングル スレッド アプリケーションではうまく機能しますが、マルチスレッド環境ではそれほどうまく機能しません。ソリューションの調査で、MSDNとこの教育的な回答の両方が、SQL トランザクションの「アトミック」部分を using/try メソッドでラップすることを推奨していることを発見しました。
private static void CreateCommand(string queryString, string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
try
{
SqlCommand command = new SqlCommand(queryString, connection);
command.Connection.Open();
command.ExecuteNonQuery();
}
catch (InvalidOperationException)
{
//log and/or rethrow or ignore
}
catch (SqlException)
{
//log and/or rethrow or ignore
}
catch (ArgumentException)
{
//log and/or rethrow or ignore
}
}
}
そこで、これからやろうとしていることは、コード全体をこのようなラッパーを使用するように変換することです。しかし、これを進める前に、このアプローチのトレードオフを理解したいと思います。私の経験では、通常、大規模な設計者/エンジニアのチームが特定の防御機能を含めないことを決定するのには十分な理由があります。これは、C/C++ プログラマーとしての私の観点からすると、C# の全体的な価値命題が "防御力" である場合に特に興味深いものです (トレードオフはよく知られている CLR パフォーマンス ヒットです)。
私の質問を要約するには:
- 上記のように、コード内のすべてのトランザクションをカプセル化することのトレードオフは何ですか?
- 探すべき注意事項はありますか?