1

データベースとの接続の量を最小限に抑える方がよいため (特にネットワーク トラフィックが激しい状況では)、効率の観点からは、多数の小さなクエリよりも 1 つの大きなクエリを使用する方がよいことを知っています。

私の質問は、一連のデータベース操作を分離して原子化する (そして、そのうちの 1 つが失敗した場合にロールバックを行う) 以外に、トランザクションは大きなクエリのように振る舞うのでしょうか? つまり、多くのデータベース操作を行う必要がある場合、それをトランザクションにラップして、1 つの大きな操作に変えることはできますか?

4

4 に答える 4

2

いいえ、あなたが何を求めているのか理解できれば。トランザクションは、データベース履歴にチェックポイントを設定するものと考えることができるため、トランザクション内の個々の操作のいずれかが失敗した場合、データベースの状態をチェックポイントに復元できます。これは非常に単純化されていますが、概念的にはトランザクションの仕組みです。

トランザクション内では、個々のクエリが個別に実行されます。

また、「多くの小さなクエリではなく、1つの大きなクエリ」を使用する方が常に優れているとは限りません。それはクエリが何であるかに依存します。一度に1つずつ要求するよりも、1つの大きなクエリで一連の行を要求する方が効率的です。私は実際にこれを行うコード(擬似コード)を見てきました:

SELECT id FROM people WHERE ... ORDER BY lastname;

for each (id) {
    SELECT firstname, lastname, phone from people WHERE id = {id};
    ...
}

それははるかに効率的です

SELECT id, firstname, lastname, phone FROM people WHERE ... ORDER BY lastname;
于 2012-05-11T06:35:25.633 に答える
0

ディスクI/Oに関して:たぶん(トランザクションの大きさや他の多くの要因によって異なります)。あなたが質問しているネットワークI/Oに関して:いいえ。トランザクションはサーバー側で実装されます。

于 2012-05-11T06:37:22.933 に答える