NoSQL データベースがトランザクションをサポートしないことが多い理由と、それを回避する方法
公開: 2022-11-21トランザクションは、あらゆるデータベース システムの重要な部分であり、同時更新に直面したときにデータの整合性と一貫性を確保する方法を提供します。 ただし、すべてのデータベースがトランザクションをサポートしているわけではありません。 特に、NoSQL データベースは多くの場合、トランザクションを実行する方法を提供しません。 これは、データの破損や不整合につながる可能性があるため、トランザクション サポートを必要とするアプリケーションにとって大きな問題になる可能性があります。 ただし、NoSQL データベースのトランザクション サポートを提供するために使用できるいくつかの回避策があります。 この記事では、トランザクションとは何か、NoSQL データベースがトランザクションをサポートしないことが多い理由、およびこの制限を回避する方法について説明します。
NoSQL ソリューションのトランザクション セマンティクスは、リレーショナル データベースのトランザクション セマンティクスよりも軽量ですが、それでもある程度のアトミック操作を提供します。 Node.js または Ruby/Rack の使用方法を知っている場合は、Heroku.com で簡単に小さなモックアップを作成できます。 残念ながら、私はまだこれを実装していないことをお知らせします。 トランザクションを実行する場合、ACID プロパティを達成できる必要があります。 大部分の NoSQL ツールは、フォールト トレランスとスケーリングの可用性を実現するために、操作の一貫性の基準を減らします。 VoltDB など、インメモリで列指向の分散型 SQL/ACID データベースを使用することをお勧めします。 これを達成するために「楽観的トランザクション」を使用できますが、先に進む前に、データベース実装の原子性保証 (たとえば、何語を連続して読み書きする必要があるかなど) を理解する必要があると思います。
いくつかのディスカッション フォーラムによると、インターネット上でいくつかのHBase トランザクションが行われているとのことです。 通常、NoSQL データベースには 2 つのタイプがあります。キー/バリュー ストアと分散データ ストアです。どちらも好みの RDBMS に実装されており、DBA の支援と NoSQL の柔軟性とパフォーマンスを利用して維持できます。 NoSQL ソリューションに比較と照合が含まれている場合は、その上で楽観的トランザクションを使用できます。
NoSQL データベースの場合、この時期は特に重要でした。リスクはより高く、ついに分散トランザクションを実装する時が来ました。 それまでは、通常、トランザクションは 1 つのサーバーでコミットされ、以前と同じ方法でクラスターの残りの部分に複製されていました。
Nosql がトランザクションに適していない理由
ACID トランザクションは、NoSQL データベースでは実行されません。 今日のアプリケーションでは、NoSQL で実行する必要があるトランザクションでこれらのプロパティを使用するのは簡単ではありません。 構造化データはサポートされておらず、構造化クエリ言語も採用していません。
開発で NoSQL データベースを使用すると、開発者はインメモリ構造をリレーショナル構造に変換することなく、同じレベルの同時実行性を実現できます。 さらに、それらは確かに高レベルのデータ セキュリティを提供しますが、現代の IT 組織がそうすることが重要です。 非常に大きなデータベースをより小さく管理しやすい部分に分割するシャーディングのプロセスは、すべてのデータベースで自動化できるわけではありません。 NoSQL データベースを使用する場合、データは複数のノードに分割されるため、より効率的にアクセスできるため、より大きなコンピューティング能力でより大きなデータセットに選択的にアクセスできます。 データベースに高レベルのスケーラビリティ、信頼性、可用性を要求する最新のアプリケーションは、リレーショナル データベースにも高レベルの信頼性とスケーラビリティを要求しています。 NoSQL の欠点は、今日のアプリケーションのさまざまな戦略を使用して克服できます。
ニーズに適した NoSQL データベースを選択するには、さまざまな考慮事項が必要です。 このリストには、必要なデータの種類、必要な信頼性のレベル、必要な速度とスケーラビリティの量などの要素が含まれています。 MongoDB、Cassandra、および Redis は、最も人気のある NoSQL データベースの一部です。 これらのデータベースにはそれぞれ独自の長所と短所があるため、最適なデータベースを選択する必要があります。 NoSQL データベースがニーズに最適な選択肢であるという保証はありません。 NoSQL データベースの主な欠点の 1 つは、リレーショナル データベースに見られる信頼性機能をネイティブにサポートできないことです。 信頼性の特徴の中でも、原子性、一貫性、分離性、耐久性はすべて重要です。 トランザクションを実行する必要がある場合、MongoDB は最適なデータベースではありません。 トランザクションを必要とするアプリケーションはますます少なくなっていますが、複数のドキュメント/コレクションを更新するためにトランザクションを必要とするアプリケーションもあります。 NoSQL データベースを選択する際には、使用するデータの種類、必要な信頼性のレベル、データベースのパフォーマンスとスケーラビリティなど、さまざまな要因を考慮することが重要です。 MongoDB、Cassandra、Redis は、現在利用可能な NoSQL データベースのほんの一部です。
Mongodb が財務データに推奨されない理由
MongoDB を財務データに使用してはいけないのはなぜですか?
トランザクション サポートがないため、MongoDB を財務データで使用することはお勧めしません。 トランザクションを実行することは、データの信頼性と一貫性にとって重要です。 データベースとの整合性または同期を確保するためにトランザクションが必要ですが、常に実行されるわけではありません。
Nosql トランザクション Acid
NoSQL データベースは、リレーショナル データベースとは異なり、トランザクションをサポートしていません。 これは、NoSQL データベースを使用する場合、トランザクションの ACID プロパティに依存できないことを意味します。 ただし、一部の NoSQL データベースは、アトミック操作など、トランザクションの一部の機能をサポートしています。
異なる Nosql データベースは、異なるレベルのトランザクション サポートを提供する場合があります。
異なる Nosql データベースは、異なるレベルのトランザクション サポートを提供する場合があります。 たとえば、完全なトランザクション サポートを提供するデータベースもあれば、限定的なサポートしか提供しないデータベースもあります。 これは、Nosql データベースを選択する際に考慮すべき重要な要素です。
開発者がオブジェクト指向データベースとリレーショナル データベースの違いをよりよく理解できるように、データはリレーショナル データベースに格納されるのではなく、オブジェクト指向の観点からモデル化されます。 ドキュメント指向のデータベース (MarkLogic、MongoDB、CouchDB など) では、このインピーダンスの不一致が完全に解消されています。 NoSQL データベースの欠点は、俊敏性とスケーラビリティの点でそのような機能を提供しないことです。 実際には、ACID プロパティの重要性は、それらが市場でどのように適用または対処されているかによって示されます。 NoSQL データベースである MarkLogic は、NoSQL データベースの一例であり、Java で複数ステートメントのトランザクションをどのように支援するかを見ていきます。 MarkLogic は、ドキュメント指向の NoSQL データベースです。 複雑なマッピングを行うことなく、オブジェクトを言語に依存しない自己記述形式にシリアライズすることができます。
次の例では、永続性のために POJO を MarkLogic に提示するために JAXB が使用されています。 MarkLogic の ACID プロパティを使用すると、アイテムが購入されたときに在庫に (在庫削減の形で) 購入が反映されます。 データベースは、その観点から、このタスクを全か無かの操作として実行します。 このトランザクションはマルチステートメント トランザクションであるため、MarkLogic は初めて読み取り操作を実行することでドキュメント レベルのロックを作成します。 上記のプログラムが正常に実行された場合、3 つの項目を含む注文と、項目数を減らすための在庫項目の更新を受け取ります。 プログラムが再び実行されると、在庫がないことを主張することによって、トランザクションの例外を強制することができます (多少偽物ではありますが)。 その結果、この場合にトランザクション全体を中止すると、次のエラーが表示されます。
オブジェクトを更新する目的でオブジェクトを読み取る場合、操作を完了する前に他のスレッドがその状態を変更しないようにする必要があります。 これを保証するために、読み取り操作がトランザクション コンテキストの外で実行される場合、暗黙的にロックされることはありません。 タスクを完了するには、DocumentDescriptor オブジェクトを操作する必要があります。 私たちは楽観的ロックを信じています。なぜなら、その後の更新を実行しても、オペレーティング システムが変更されないという確信があるからです。 この建物で隔離違反が発生することは珍しくありません。 ただし、問題がある場合は調査する必要があります。 MarkLogic は更新されたバージョンを追跡し、更新された場合はメールでお知らせします。 MarkLogic サーバーの目標は、開発者がその機能を犠牲にすることなく使用できる方法で強力な機能を提供することです。 これらのトピックやその他のトピックに関する追加情報については、Web サイトを自由に参照してください。 この記事で使用されている複数ステートメントのトランザクションの例については、GitHub ページを参照してください。
Mongodb が最高のドキュメント データベースである理由
ドキュメント データベースは、大量のデータを格納するアプリケーションに最適です。 地球上で最も人気のあるドキュメント データベースは MongoDB です。
キー値ストアは、データを単純なデータ モデルに格納する必要があるアプリケーションに役立ちます。 Redis のような Key-Value ストアは、最も人気のあるストアの 1 つです。
テーブルにデータを格納する必要がある場合は、列指向データベースが最適です。 MySQL は、最も広く使用されている列指向データベースです。
グラフ データベースを使用して、データをグラフに格納できます。 これは、最も人気のあるグラフ データベースであり、最も人気のある NoSQL データベースの 1 つです。
Mongodb トランザクション
MongoDB では、トランザクションは、データベースに対する 1 つ以上の操作で構成される単一の作業単位です。 トランザクションは、データの整合性を確保し、データが期待どおりの順序で処理されるようにするのに役立ちます。
MongoDB は、次の 2 種類のトランザクションを提供します。
1. 単一操作: 最も一般的なタイプのトランザクションで、単一のドキュメントの更新、挿入、または削除に使用されます。
2. マルチドキュメント トランザクション: これらのトランザクションは、複数のドキュメントを更新、挿入、または削除でき、データが特定の順序で処理されるようにするのに役立ちます。
トランザクションを開始するには、db.collection.startTransaction() メソッドを使用します。 このメソッドは、トランザクションの読み取り関連と書き込み関連を指定できるいくつかのパラメータを取ります。 読み取り懸念は、MongoDB がトランザクションのデータを読み取る方法を指定し、書き込み懸念は、MongoDB がトランザクションのデータを書き込む方法を指定します。
トランザクションを開始すると、データベースに対して通常実行するすべての操作を実行できます。 トランザクション内で実行するすべての操作は、同じ作業単位の一部になります。
トランザクションをコミットするには、db.collection.commitTransaction() メソッドを使用します。 このメソッドは、トランザクション内で行ったすべての変更をデータベースに書き込みます。
トランザクションを中止したい場合は、db.collection.abortTransaction() メソッドを使用します。 このメソッドは、トランザクション内で行ったすべての変更をロールバックします。
トランザクションという用語は、複数のドキュメントの読み取りや書き込みなど、データベース内の 1 つ以上の操作を処理するプロセスの論理グループを指します。 トランザクションは、複数のステートメントをグループ化して分離することにより、統一された操作を作成するために使用されます。 ACID 準拠を実現するために、データベースの原子性と分離が使用されます。 MongoDB には、トランザクション処理用の 2 つの API があります。 最初の API であることに加えて、コア API にはリレーショナル データベースの構文に似た構文があります。 2 番目のオプションは、MongoDB のトランザクション処理を使用することです。 通常、トランザクションは、アプリケーション言語の適切な MongoDB ドライバーで定義された API メソッドの 1 つを使用して記述および実行されます。
MongoDB でセッションを作成することは、トランザクションを生成するための最初のステップです。 startTransaction() メソッドは、readConcern と writeConcern の 2 つの部分に分かれています。 これらのオプションにより、マジョリティ コミット ステータスのデータがリアルタイムで同期されます。 エラーが発生した場合、トランザクションは中止されます。 詳細については、添付のリストを参照してください。 この点で、実行中の著者を雇うことができます。 著者は当社が管理しています。 このセッションでは、前の結果に追加して返すので、すぐに find() を呼び出します。
このガイドでは、トランザクションと、MongoDB でのトランザクションの最適なユース ケースを定義します。 MongoDB でのトランザクション セッションのプロセスも概念的に説明しました。 MongoDB と Prisma について詳しく知りたい場合は、「ゼロから始める」ガイドまたは「既存のプロジェクトに追加する方法」ガイドを作成しました。 トランザクションに MongoDB を使用するには、多くのベスト プラクティスが必要です。 トランザクション データは、ACID準拠のトランザクションによって無効なデータベース状態から保護されます。 トランザクションを開始したらすぐに、60 秒間実行し続けるように最適化してください。 操作の数は、トランザクションで 1,000 ドキュメントを超えてはなりません。
MongoDB のアトミック トランザクション保証は、データの一貫性とデータの整合性を必要とするアプリケーションにとって優れた選択肢となります。 さらに、トランザクションは ACID 標準の重要なコンポーネントであり、データへの継続的なアクセスを必要とするアプリケーションに必要です。
Mongodb の力: トランザクション
マルチページ トランザクションは、NoSQL データベースである MongoDB を使用して実行できます。 トランザクションを使用して、1 つまたは複数のコレクションからの複数のドキュメントに対する複数の読み取りと書き込みがアトミックであることを確認できます。 トランザクションに加えて、トランザクションを使用して、複数の操作、コレクション、データベース、ドキュメント、およびシャードにわたる原子性を確保することができます。 MongoDB が常に原子性を提供してきたという事実は、MongoDB を優れたトランザクション ツールにしています。 MongoDB は、1 秒あたり 2 億 5000 万トランザクションの速度でトランザクションを処理します。
Oracle Nosql データベース トランザクション
Oracle NoSQL Database トランザクションは、1 つの単位として実行される読み取りと書き込みのセットです。 トランザクション内のすべての書き込みは、トランザクションがコミットされた後に発生するすべての読み取りに表示されます。 トランザクションは、複数のキーとデータ項目にまたがることができます。
Nosql データベース: いつ使用し、いつ使用しないか
一方、NoSQL データベースは、大量の非構造化データを保存する必要がある組織や、構造化されていないデータを保持する必要がある組織に適しています。 従来のデータベースとは異なり、NoSQL データベースではトランザクションのサポートはサポートされていません。 これは、大量のデータを保存する必要があり、データを保存および管理するための一貫した方法を探しているシステムには最適な選択ではない可能性があります。
Nosql データベース
Nosql データベースは、従来の SQL データベース構造を使用しないデータベースです。 代わりに、最新のアプリケーションのニーズを満たすために、より簡単にスケーリングできる、より柔軟な構造を使用します。
NoSQL データベースのデータは、テーブルではなくドキュメントに格納されます。 これらは、柔軟でスケーラブルで、最新のビジネス ニーズに数分で対応できるように設計されています。 ドキュメント データベース、キー値ストア、幅の広い列のデータベース、およびグラフ データベースは、利用可能な NoSQL データベースの種類の一部です。 Global 2000 の組織は、ミッション クリティカルなアプリケーションを強化するために NoSQL データベースを急速に採用しています。 上記の 5 つの傾向は、ほとんどのリレーショナル データベースが直面する最も困難な技術的課題の 1 つです。 リレーショナル データベースのデータ モデルは固定されているため、アジャイル開発の大きな障壁となっています。 NoSQL は、アプリケーション モデルをデータ モデルのサブセットとして定義します。
NoSQL を使用したデータのモデリングは静的ではありません。 ドキュメント指向データベースにデータを格納するための事実上の形式は JSON です。 さらに、これにより ORM フレームワークの使用が不要になり、アプリケーション開発が合理化されます。 新しく導入された N1QL クエリ言語 (ニッケルと発音) は、Couchbase Server 4.0 の強力な SQL および JSON 拡張機能です。 この製品は、標準の SELECT / FROM / WHERE ステートメントをサポートできるだけでなく、集計 (GROUP BY)、並べ替え (SORT BY)、結合 (LEFT OUTER / INNER) などもサポートしています。 NoSQL データベースは、高レベルの運用効率とスケールアウト アーキテクチャによって際立っています。 Web やモバイル アプリを介してオンラインで企業とやり取りする顧客が増えるにつれて、サービスの可用性が問題になっています。
NoSQL データベースは、簡単にデプロイおよび構成できます。 それらは、読み取り、書き込み、および保存用に特別に設計されています。 それらは、さまざまなサイズのクラスターの管理と監視を含め、幅広い規模で動作します。 NoSQL データベースは複数のデータ センターに分散されており、別のソフトウェアを必要とせずに複製できます。 また、ハードウェア ルーターを介して即時のディザスタ リカバリを有効にするためにも使用できるため、データベースが問題を検出して独自のリカバリを実行するのをアプリケーションが待機する必要がなくなります。 NoSQL データベースの進歩により、複数のプラットフォームで実行される Web、モバイル、および IoT アプリケーションを作成できます。
NoSQL データベースは、スケーラビリティ、レプリケーション、および柔軟性のために有益です。 高いパフォーマンスにもかかわらず、パフォーマンスを損なうことなく大量のデータを処理できます。 さらに、テキスト、画像、構造化データをさまざまな形式で保存する必要があるアプリケーションに最適です。
Nosql データベースの利点
NoSQL データベースには、パフォーマンスの高速化や柔軟性の向上など、従来のリレーショナル データベースに勝るいくつかの利点があります。 ビデオ ストリーミングやソーシャル メディアの投稿など、リレーショナル モデルに適合させることが困難なデータを格納することができます。 また、リレーショナル データベースと同じレベルのスキーマとデータ マッピングを必要としないため、データ クエリに関してもより効率的です。
酸取引
トランザクションの特性を決定する際、ACID という頭字語は、原子性、一貫性、分離性、耐久性の 4 つの重要な特性によって定義されます。 データベース内のトランザクションは、これらの ACID 特性を持つものとして定義でき、トランザクション システムは、データ ストレージに適用されるこれらの ACID 特性を持つものとして定義できます。
ACID (Atomicity、Consistency、Isolation、Durability) と呼ばれるプロパティ セットは、データベース トランザクションの重要なコンポーネントです。これは、エラーや電源障害などが発生した場合でも維持する必要があるプロパティ セットであるためです。 トランザクションは、データベースの変更に不可欠なコンポーネントです。 分散アプリケーションを開発する場合、ACID トランザクションを理解することが重要です。 DBMS は原子性に対して 2 つのアプローチを採用しています。 変更が適用される前に、ログ ファイルがサーバーに書き込まれます。 対照的に、2 番目のアプローチは、データベースがページと呼ばれる固定長のブロックに分割されていることを前提としています。 トランザクションの過程で、ページの 2 つのコピー (現在のページとシャドウ ページ) が存在します。
トランザクションは、一貫性のない状態のリスクを回避するために、独立したプロパティでシリアル順に実行されます。 クライアントは、トランザクションが継続的に実行されているという錯覚によって DBMS システムにだまされ、トランザクションの終了時の状態について推論することができます。 一部のトランザクションには時間がかかる場合があるため、クライアントは、長期間のトランザクションを待機する方が簡単であると感じる場合があります。 DBMS では、一連のトランザクションが同時に実行される場合にのみトランザクションのインターリーブが許可され、その結果、トランザクションによってスケジュールが作成されます。 同じデータ項目に対する操作は複数のトランザクションによって実行され、そのうちの 1 つが書き込み操作です。 原子性のセクションでは、原子性と耐久性を実現するためのより一般的なアプローチのいくつかについて説明します。
酸性コンプライアンスの重要性
データベース トランザクションが円滑かつ確実に機能するためには、常に予測可能で信頼できる方法で成功または失敗する必要があります。 ACID は、トランザクションの 4 つの主要かつ最も重要なプロパティである原子性、一貫性、分離性、耐久性を表す用語です。 これらの要件を満たすトランザクションは、ACID 準拠であると言われています。