単一の SELECT クエリを実行した後、一連の UPDATE クエリを (すべて同じテーブルで) 実行したいと考えています。UPDATE は、繰り返し呼び出される別のメソッドで実装されます。UPDATE クエリの 1 つが失敗した場合、それらすべてを失敗/ロールバックさせたいので、それらをトランザクションに参加させたいと考えています。ただし、SqlConnection
問題を回避するためにどこを開けばよいかわかりません。私の現在の実装は次のようになります。
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// execute a single SELECT here
using (TransactionScope scope = new TransactionScope())
{
for (int i=0; i<...; i++)
{
Update(); // UPDATE query
}
scope.Complete();
}
}
Update()
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// execute a single UPDATE here
}
}
これはすべての状況で期待どおりに機能する必要がありますか?
Update()
SELECT の前に接続を開き、メソッドで新しい接続を開いても問題ありませんか? 接続プールにより、同じ接続が SELECT クエリと UPDATE クエリの両方に使用されますが (connectionString
同じです)、トランザクションに参加するのは UPDATE クエリだけですよね? しかし、別の接続が で使用されるとどうなりUpdate()
ますか? すべての UPDATE クエリは、期待どおりにトランザクションに参加し、アトミックに実行されますか?
私が正しく理解していれば、最初の接続を閉じた後 ( using
SELECT を実行するブロックの後) にトランザクション スコープを作成しても機能しますが、接続が閉じられ、再度開く必要があるため、パフォーマンスが低下します。正しいですか? Update()
それとも、実際にはトランザクション スコープ用に作成された新しい接続であり、呼び出されるたびに開閉されますか?