sql - ERPのデフォルトのトランザクション分離レベルとして最適なものはどれですか?

Translate

短い背景:ERPシステムをHibernateを使用してJavaに移行/再実装し始めたばかりで、システムを使用する同時ユーザー数50〜100ユーザーを対象としています。データベースサーバーとしてMSSQL Serverを使用します。これは、この負荷には十分です。

現在、古いシステムはトランザクションをまったく使用せず、手動ロックの設定(フラグを使用)とそれらの解放に重要な部分(在庫変更など)に依存しています。これは、手動のトランザクション管理のようなものです。ただし、データの不整合に問題がある場合があります。新しいシステムでは、トランザクションを使用してこれらの問題を一掃したいと思います。

今の質問:良い/合理的なものは何でしょうかデフォルト約85%のOLTPと15%のOLAPを使用する場合、ERPシステムに使用するトランザクション分離レベルは?または、使用するトランザクションレベルを、タスクごとに常に決定する必要がありますか?

また、4つのトランザクション分離レベル(READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE)を思い出してください。

This question and all comments follow the "Attribution Required."

すべての答え

Translate

100回のうち99回、読み取りコミットが正解です。これにより、他のセッションによってコミットされた変更のみが表示されます(したがって、トランザクションを正しく設計したと仮定すると、結果は一貫しています)。ただし、繰り返し可能な読み取りまたはシリアル化可能なデータベースが課すロックオーバーヘッド(特にOracle以外のデータベース)は課しません。

非常にまれに、速度のために精度を犠牲にして、読み取りのコミットされていない分離レベルを設定することをいとわないレポートを実行したい場合があります。これが良い考えになることはめったにありませんが、競合の問題をロックすることは、合理的に許容できる回避策である場合があります。

シリアル化可能で繰り返し可能な読み取りは、その時点で他のトランザクションが何を行っているかに関係なく、実行全体にわたって一貫したデータセットを確認する必要があるプロセスがある場合に使用されることがあります。月末の調整プロセスをシリアル化可能に設定することが適切な場合があります。たとえば、手順コードが多い場合、プロセスの実行中にユーザーが変更を加える可能性があり、プロセスで必要な要件があります。調整の開始時に存在していたデータが常に表示されていることを確認してください。

ソース
Translate

SERIALIZABLEのすぐ下にあるSNAPSHOTを忘れないでください。

レポートでデータが正確であることがどれほど重要かによって異なります。それは本当にタスクごとのものです。

ソース
Translate

アプリケーションの設計方法に大きく依存します。簡単な答えはREAD_COMMITTEDで実行するだけです。

READ_UNCOMMITTEDをデフォルトとして使用し、必要な場合にのみ分離レベルを上げることができることを念頭に置いてシステムを設計する場合は、議論することができます。とにかくトランザクションの大部分は成功するので、コミットされていないデータを読み取ることは大したことではありません。

分離レベルがクエリに与える影響は、ターゲットデータベースによって異なります。たとえば、SybaseやMSSQLなどのデータベースは、READ_COMMITTEDを実行するときに、Oracleなどのデータベースよりも多くのリソースをロックする必要があります。

ソース
Translate

SQL Server(およびおそらく最も主要なRDBMS)の場合、デフォルトを使用します。 SQL Serverの場合、これはREADCOMMITTEDです。それ以上のことをすると、DBに過剰な負担をかけ始め、それ以下のことをすると、一貫性の問題が発生します。

ソース
Translate

Read Uncommittedは、ほとんどのフォーラムで間違いなく弱者です。ただし、よく指摘される「速度対精度」の問題を超えて使用する理由があります。

あなたが持っているとしましょう:

  • トランザクションT1:書き込みB、読み取りA、(もう少し作業)、コミット。
  • トランザクションT2:書き込みA、読み取りB、(もう少し作業)、コミット。

読み取りがコミットされると、上記のトランザクションはコミットされるまで解放されません。次に、T1がT2がAを解放するのを待っており、T2がT1がBを解放するのを待っている状況に遭遇する可能性があります。ここでは、2つのトランザクションがロックで衝突します。

このシナリオを回避するために、これらの手順を書き直すことができます(例:常にアルファベット順にリソースを取得します!)。それでも、同時ユーザーが多すぎて数万行のコードがある場合、この問題は非常に起こりやすく、診断と解決が非常に困難になる可能性があります。

別の方法は、ReadUncommittedを使用することです。次に、ダーティリードがある可能性があると想定してトランザクションを設計します。私は個人的に、この問題は連動する列車事故よりもはるかに局所的で治療可能だと感じています。

ダーティリードからの問題は、

  • (1)ロールバック:しないでください。これは、ハードウェア障害、ネットワーク障害、またはプログラムのクラッシュのみが発生した場合の最後の防衛線となるはずです。

  • (2)アプリケーションロックを使用して、より高いレベルの抽象化で動作するロックメカニズムを作成します。各ロックは、実際のリソースまたはアクションに近くなります。

ソース
Leave a Reply
You must be logged in to post a answer.
著者について