21

私の会社で使用している社内アプリケーション フレームワークでは、どのコマンドもデータベースを変更しないことが分かっていても、すべての SQL クエリをトランザクションに入れる必要があります。セッションの最後に、接続を閉じる前に、トランザクションをコミットして適切に閉じます。特に速度に関しては、ロールバックした場合に特に違いがあったのだろうか。

私は Oracle を使用していますが、他のデータベースも同様の動作をしていると思います。また、トランザクションを開始するための要件については何もできません。コードベースのその部分は私の手に負えません。

4

7 に答える 7

13

データベースは多くの場合、変更前イメージ ジャーナル (トランザクション前の状態) または変更後イメージ ジャーナル (トランザクション完了時の状態) のいずれかを保持します。変更前イメージを保持する場合は、ロールバック時に復元する必要があります。 . 残像を保持している場合、コミット時にデータを置き換える必要があります。

Oracle には、ジャーナル スペースとロールバック スペースの両方があります。トランザクション ジャーナルは、後で DB ライターによって書き込まれるブロックを蓄積します。これらは非同期であるため、トランザクションに影響を与える DB ライター関連はほとんどありません (キューがいっぱいになると、待機する必要がある場合があります)。

クエリのみのトランザクションの場合でも、Oracle のロールバック領域に多少のトランザクション記録保持があることは間違いありません。ロールバックには、実際にロールバックするものがないと判断する前に、Oracle 側で何らかの作業が必要になると思います。そして、これはあなたのトランザクションと同期していると思います。ロールバックが完了するまで、ロックを実際に解放することはできません。[はい、トランザクションで何も使用していないことは知っていますが、ロックの問題が原因で、ロールバックを完全に解放する必要があり、その後すべてのロックを解放して、ロールバックを終了する必要があると思います。]

一方、コミットは多かれ少なかれ予想される結果であり、ロールバック領域を破棄する方がわずかに速いのではないかと思います。トランザクション エントリを作成しなかったため、db ライターが起動して、何もする必要がないことを確認して発見することさえありません。

また、コミットの方が速いかもしれませんが、違いは小さいと思います。非常に小さいため、並べて比較しても測定できない場合があります。

于 2008-10-13T16:46:18.060 に答える
8

この場合、COMMIT と ROLLBACK の間に違いはないという以前の回答に同意します。COMMIT に何もないと判断するのに必要な CPU 時間と、ROLLBACK に何もないと判断するのに必要な CPU 時間との間には、ほとんど差がない可能性があります。しかし、それが無視できる程度の差であれば、安全に忘れることができます。

ただし、単一のトランザクションのコンテキストで一連のクエリを実行するセッションと、一連のトランザクションのコンテキストで同じクエリを実行するセッションには違いがあることに注意してください。

クライアントがトランザクションを開始し、クエリを実行し、COMMIT または ROLLBACK を実行してから、2 番目のトランザクションを開始し、2 番目のクエリを実行した場合、2 番目のクエリが最初のクエリと同じデータベース状態を観察するという保証はありません。場合によっては、データの単一の一貫したビューを維持することが不可欠です。より最新のデータ ビューを取得することが重要な場合があります。それはあなたが何をしているかによります。

私は知っています、私は知っています、OPはこの質問をしませんでした. しかし、一部の読者は心の奥底でそれを尋ねているかもしれません.

于 2008-10-13T16:43:16.663 に答える
3

ドキュメントには次のように記載されています。

  • Oracle Databaseから切断する前に、アプリケーション・プログラムのすべてのトランザクション(最後のトランザクションを含む)を COMMIT または ROLLBACK 文で明示的に終了することをお薦めします。トランザクションを明示的にコミットせずにプログラムが異常終了した場合、最後にコミットされていないトランザクションが自動的にロールバックされます。ほとんどの Oracle ユーティリティおよびツールを正常に終了すると、現在のトランザクションがコミットされます。Oracleプリコンパイラ・プログラムからの通常の終了では、トランザクションはコミットされず、Oracle Databaseに依存して現在のトランザクションがロールバックされます。

http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_4010.htm#SQLRF01110

どちらかを選択したい場合は、何もしないのと同じことをして、コミットするだけです。

于 2008-10-13T22:18:10.310 に答える
3

一般に、COMMIT は ROLLBACK よりもはるかに高速ですが、何もしていない場合は事実上同じです。

于 2008-10-13T16:15:40.760 に答える
1

さて、Oracle で SELECT が返すものを考慮する必要があります。2 つのモードがあります。デフォルトでは、SELECT は、SELECT ステートメントの実行が開始された瞬間のデータを返します (これは、デフォルトのトランザクション モードである READ COMMITTED 分離モードでのデフォルトの動作です)。そのため、SELECT が発行された後に UPDATE/INSERT が実行された場合、結果セットには表示されません。

これは、2 つの結果セットを比較する必要がある場合に問題になる可能性があります (たとえば、総勘定元帳アプリの債務側と貸方側)。そのために、2 番目のモードがあります。そのモードでは、SELECT は、現在のトランザクションが開始された時点のデータを返します (READ ONLY および SERIALIZABLE 分離レベルでのデフォルトの動作)。

そのため、少なくともトランザクションで SELECT を実行する必要がある場合があります。

于 2008-10-21T20:27:06.270 に答える
0

DML を実行したことがないので、Oracle では COMMIT と ROLLBACK に違いはないと思います。いずれにせよ、何もすることはありません。

于 2008-10-13T16:07:10.463 に答える
0

コミットの方が効率的だと思います。一般に、ほとんどの DB トランザクションがコミットされると予想されるためです。そのため、DB はこの場合に最適化されると考えられます (ロールバックの効率を高めるのではなく)。

于 2011-04-07T10:52:47.913 に答える