複数のデータベース接続ごとに 1 つのトランザクションを使用することが意味があるのはどのような場合ですか?

StackOverflow https://stackoverflow.com/questions/2161899

質問

1 つの共有データベース トランザクションと複数の接続がどのようなシナリオで意味があるのか​​を理解できる人はいますか?ありがとう。

役に立ちましたか?

解決

個人的には、RDBMS ではこれが賢明であるとは思えませんが、非常に高負荷なデータベースの設計の複雑さが軽減されることはわかります。

たとえば、電子商取引の場合、製品在庫を 1 つのデータベースに置き、注文を別のデータベースに置くように、データベースを分割することができます。この場合、注文の処理時に在庫数を減らして請求書数を増やすことは望ましくありません。その場合、グローバル トランザクションが合理的になります。

しかし、99% は設計で解決できるより良い代替手段があります。

- 編集 :グローバルトランザクションの落とし穴 --

この 2 つの点が、グローバル トランザクションを使用しないことをお勧めする理由です。

ポイント1:

グローバル トランザクションには複数のデータベース サーバーが関与します (少なくともそうすべきです) -- グローバル トランザクションには DTC (分散トランザクション コーディネーター) が必要です -- このようなエージェントを使用すると、物事が複雑ではないため、クエリの速度が順序どおりに低下します。単一のマシンの範囲内で実行されますが、複数のマシン、つまりネットワークが関与することによって実行されます。

ポイント2:

クエリが適切に設計されていない場合 (ほとんどの人はその微妙な点を理解していません)、個々のデータベース上のテーブルの大部分をロックすることになる可能性があり、場合によっては 1 つのクエリでテーブル全体をロックしてしまうことさえあります。分散クエリ用に適切に設計されていない場合、アプリケーションは停止し、誰かが解雇されるでしょう :D。クエリが最終的に必要な部分のみをロックするようにする必要があり、データのこれらのロックされた部分が 1 つのクエリによってのみ同時に使用されるようにする必要があります。

分散クエリでテーブルをロックする方が悪いのはなぜですか?ポイント1のため。ファクタの注文により最後の注文をより長くロックできるようになりました。

- 編集 :調査したい可能性のある領域 --

クラスタリング テクノロジと HPC は、多くの場合、 分散ロックマネージャー. 。これらのテクノロジのデータ管理バリアントを研究することで、これらの実装がグローバル ロックを取得する必要があると判断する場所 (グローバル トランザクションが行うこと) がわかるため、多くのことを学ぶことができます。

他のヒント

複数のデータベースが 1 つのトランザクション内ですべて更新されることを意味する場合は、Atomicity に対してこれを実行します。 http://en.wikipedia.org/wiki/Aomicity_(database_systems)

仮に、口座プロバイダーごとに異なるデータベースを使用する銀行振込を考えてみましょう。資金は 1 つの口座から出て、別の口座に更新される必要があります。途中で失敗した場合 - 例:2 回目のデータベース更新が失敗すると、一方の口座にはお金が残されますが、もう一方の口座には入金されません。これは受け入れられません。

トランザクションは、更新の 1 つが失敗すると、更新がすべてキャンセル (ロールバック) され、データがトランザクション開始前の状態のままになることを意味します。

あなたが複数のデータベースに影響を与えるトランザクション操作をしたい

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top