0

トランザクションの分離レベルに到達するための最良の方法は何ですか? これは、利用可能な ISOLATION レベルの適切なリンクです。

Blockquote 誰かがトランザクションのさまざまな分離レベルを説明できるといいですね

4

4 に答える 4

4

更新:説明を明確にし、修正しました。

分離レベルは、トランザクションが他の同時トランザクションによってどの程度影響を受けるかを示すだけです。分離レベルが高いほど、影響は少なくなります。

この努力は、CPU 負荷、メモリ負荷、およびおそらくコミットの遅延に現れます。さらに、高い分離レベルでは書き込み競合が発生する可能性が高くなります。これは、トランザクションを中止して、すべてを再試行する必要があることを意味する場合があります。(これは、選択のみを実行するトランザクションではなく、更新または挿入を実行するトランザクションにのみ影響します。)

一般に、アプリケーションに必要な一貫性を与える最低レベルを使用するのが経験則です。

Read Committed モードによって提供される部分的なトランザクション分離は、多くのアプリケーションに適しています。このモードは高速で使いやすいです。ただし、すべての場合に十分ではありません。複雑なクエリや更新を行うアプリケーションでは、Read Committed モードよりも厳密に一貫したデータベース ビューが必要になる場合があります。

Serializable モードは、各トランザクションがデータベースの完全に一貫したビューを参照することを厳密に保証します。ただし、アプリケーションは、同時更新によってシリアル実行の錯覚を維持できなくなった場合に、トランザクションを再試行できるように準備する必要があります。複雑なトランザクションをやり直すコストは非常に大きくなる可能性があるため、シリアル化可能モードは、更新トランザクションに含まれるロジックが非常に複雑で、Read Committed モードで間違った応答を返す可能性がある場合にのみお勧めします。通常、Serializable モードは、データベースの同一のビューを表示する必要があるいくつかの連続するコマンドをトランザクションが実行する場合に必要です。

( http://www.postgresql.org/docs/8.4/interactive/transaction-iso.htmlはとてもいいです。)

于 2009-07-07T18:53:10.780 に答える
1

分離レベルの違いがわからない場合は、デフォルトのままにしてください。レベルを変更すると、特有の副作用が生じる可能性があります。アプリケーションの 99% はデフォルトで問題ありません。

デフォルトは JDBC ドライバーごとに異なると思いますが、JPA などの一部のフレームワークではそれが強制される場合がありますが、思い出すことはできません。最も一般的なデフォルトは read_committed です。これは、トランザクションの安全性と同時実行性との間の汎用的なバランスが最適であるためです。別の分離レベルを選択すると、安全性または同時実行性のいずれかが犠牲になり、妥協点に注意する必要があります。

于 2009-07-07T19:04:42.987 に答える
0

一体何が問題なのか!

分離レベルは、DBMSが使用するロックの種類と粒度を定義します。トランザクションは潜在的に多くのユーザーによって同時に実行されるため、DBMSのコンテキストではロックが不可欠です。SERIALIZABLEなどのトランザクション分離レベルが高いほど安全です。ダーティリードやファントムアップデートを排除できる可能性がありますが、シリアル化されたトランザクションは同時実行性を制限し、スケーラビリティを妨げるため、ペナルティが課せられます。

何をすべきか?絶対に必要なときにシリアル化されたトランザクションを慎重に使用することで、ロジックが「不良データ」の可能性を制限するようにアプリケーションを設計しますが、同時実行性が不必要に妨げられることはありません。

于 2009-07-07T22:04:20.143 に答える