3

単一の 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 クエリは、期待どおりにトランザクションに参加し、アトミックに実行されますか?

私が正しく理解していれば、最初の接続を閉じた後 ( usingSELECT を実行するブロックの後) にトランザクション スコープを作成しても機能しますが、接続が閉じられ、再度開く必要があるため、パフォーマンスが低下します。正しいですか? Update()それとも、実際にはトランザクション スコープ用に作成された新しい接続であり、呼び出されるたびに開閉されますか?

4

1 に答える 1