データベースの代替案をスケーリングするためにNoSQLを検討しています。この種のことに敏感なトランザクションベースのものが必要な場合はどうすればよいですか?
一般的に、NoSQLソリューションは、リレーショナルデータベースよりも軽いトランザクションセマンティクスを備えていますが、それでもある程度のアトミック操作の機能を備えています。
一般に、マスターとマスターのレプリケーションを行うものは、一貫性を低下させ、可用性を高めます。したがって、適切な問題に対して適切なツールを選択する必要があります。
多くの場合、単一のドキュメント(または行など)レベルでトランザクションが提供されます。たとえば、MongoDBの場合、単一のドキュメントに原子性がありますが、ドキュメントは非常に豊富であるため、通常はこれで十分に機能します-詳細 here 。
これは、NoSQLデータベースに適用される最も近い答えです。 Heroku.comのAdam Wigginsの2007年のブログ投稿にあります。
データベーストランザクションを使用して、ある銀行口座から別の銀行口座への送金をラップする古い例は、合計強気です。正しい解決策は、元帳イベント(アカウント間の転送)のリストを保存し、元帳の合計として現在の残高を表示することです。関数型言語でプログラミングしている(またはそのように考えている)場合、これは明らかです。
From: http://adam.heroku.com/past/2007/12/17/a_world_without_sql/ (彼のウェブサイトはスケーラビリティに関するアイデアに最適です。)
上記の段落を次のように解釈しました:
詳細情報。キュー/バックグラウンドワーカー: http://adam.heroku.com/past/2009/4/14/building_a_queuebacked_feed_reader_part_1/
クライアント(別名メンバーまたは顧客)は、以下の手順に従ってお金を引き出します。
Node.jsまたはRuby/Rackに慣れている場合は、Heroku.comを使用して小さなモックアップをすばやく作成できます。
一般的な考え方は非常に簡単で、スケーリングが非常に難しいデータベースに焼き付けられたトランザクションを使用するよりもはるかに良いようです。
免責事項:まだこれを実装していません。これらのことについては、実際には必要ありませんが、好奇心のために読みました。はい、@ gbnは、トランザクションを含むRDBMSがTimmyと私のニーズにおそらく十分であることは正しいです。それにもかかわらず、オープンソースツールと「 Razorbladesの竜巻 」というハウツーWebサイトでNoSQLデータベースをどこまで利用できるかを見るのは楽しいでしょう。
NoSQL は、キーバリューストア、ドキュメントストア、グラフストア、ワイドカラムストアなど、さまざまなツールとサービスのセットをカバーします。彼らは通常、通常はデータ処理を分散することにより、データストアのスケーラビリティを改善しようとします。トランザクションには [〜#〜] acid [〜#〜] DBがユーザー操作を実行する方法のプロパティが必要です。 ACIDは、スケーラビリティの改善方法を制限します。ほとんどのNoSQLツールは、操作の一貫性基準を緩和して、フォールトトレランスとスケーリングの可用性を実現し、ACIDトランザクションの実装を非常に困難にします。
一般的に引用されている分散データストアの理論的推論は、 CAP定理 です。一貫性、可用性、およびパーティション許容値を同時に達成することはできません。 SQL、NoSQL、およびNewSQLツールは、それらが放棄するものに従って分類できます。良い数字が見つかるかもしれません ここ 。
ACIDに代わる新しい、より弱い要件のセットは [〜#〜] base [〜#〜] (「基本的に利用可能、ソフト状態、結果整合性」)です。ただし、最終的に一貫性のあるツール(「最終的にアイテムへのすべてのアクセスが最後に更新された値を返す」)は、銀行などのトランザクションアプリケーションではほとんど受け入れられません。ここでは、たとえば VoltDB ;のように、メモリ内の列指向の分散SQL/ACIDデータベースを使用することをお勧めします。これらの「NewSQL」ソリューションをご覧になることをお勧めします。
このスレッドで金銭取引のアドバイスにコメントしたかっただけです。トランザクションは、送金で本当に使いたいものです。
転送をどのようにキューに入れるかを指定した例は、非常にきれいで整然としています。
しかし実際には、送金には手数料や他の口座への支払いが含まれる場合があります。人々は、別のアカウントからの特定のカードを使用した場合にボーナスを受け取ります。または、同じシステム内のアカウントから別のアカウントへの手数料を受け取る場合があります。手数料または支払いは金融取引によって異なる場合があり、各取引のクレジットおよびデビットを示す簿記システムを維持する必要がある場合があります。
これは、1つのアカウントのクレジットが1つ以上のアカウントの借方に記入される可能性があるため、複数の行を同時に更新することを意味します。最初に行をロックして更新前に何も変更できないようにしてから、書き込まれたデータがトランザクションと一貫していることを確認します。
トランザクションを本当に使用したいのはそのためです。 1つの行への書き込みがうまくいかない場合は、金融取引データの一貫性が失われることなく、一連の更新全体をロールバックできます。
1つのトランザクションと2つの操作(たとえば、1つは5,000ドルを支払い、2つ目は5,000ドルを受け取る)の問題-同じ優先度のアカウントが2つあるということです。 1つのアカウントを使用して2番目のアカウントを確認することはできません(逆の順序で)。この場合、1つのアカウントのみが正しい(確認される)ことを保証でき、2番目(確認する)が失敗する可能性があります。失敗する理由を見てみましょう(メッセージaproatchを使用して、送信者は受信者によって確認されます):
#1の保存を保証します。しかし、#2が失敗した場合、誰が保証しますか?逆順でも同じです。
しかし、これはトランザクションなしでNoSQLを使用して安全に実装することが可能です。送信者および受信者側から確認される3番目のエンティティの使用が常に許可され、操作が実行されたことを保証します。
このトランザクションレコードは、送信/受信メッセージに問題がないことを保証します。これで、トランザクションIDごとにすべてのメッセージを確認し、受信または完了した状態があるかどうかを確認できます-ユーザーのバランスを考慮してください。
DBに依存しますが、...一般的に言って、これを達成するには 'Optimistic transaction' を使用できますが、確認する必要があると思いますデータベース実装の atomicity 保証を理解するため(たとえば、どの種類の書き込みおよび読み取り操作がアトミックか)。
ネット上でいくつかの議論があるようですHBase トランザクションそれはどんな助けでも。
強力な整合性と実装されたトランザクションを備えたスカラーは、SQLデータベースではありません。
そのため、非構造化データアプローチの力でエンタープライズアプリケーションで「実際の」トランザクションを使用できるように、NoSQLドキュメントストアソリューションを作成しています。 http://djondb.com を見て、便利だと思われる機能を自由に追加してください。
SQL DBでは常にNoSQLアプローチを使用できます。 NoSQLは一般に「キー/値データストア」を使用しているようです。NoSQLのパフォーマンスと柔軟性の利点を実現しながら、これを好みのRDBMSにいつでも実装できるため、トランザクション、ACIDプロパティ、使いやすいDBAからのサポートなどの良いものを保持できます、例えばなどのテーブル経由
CREATE TABLE MY_KEY_VALUE_DATA
(
id_content INTEGER PRIMARY KEY,
b_content BLOB
);
おまけに、メインのBLOB(またはaptの場合はTEXT)フィールドにかさばるコンテンツを保持したまま、ここに追加のフィールドを追加して、コンテンツを他の適切なリレーショナルテーブルにリンクできます。
個人的には、データを操作するための言語に縛られないように、TEXT表現を好みます。シリアル化されたJavaを使用すると、レポート作成のためにPerlのコンテンツにアクセスできることを意味します。TEXTはデバッグが容易であり、一般に開発者として動作します。
きっと他にもある
比較および設定をサポートしている場合、NoSQLソリューションの上に楽観的なトランザクションを実装できます。 GitHub ページでMongoDBでそれを行う方法の例と説明を書きましたが、適切なNoSQLソリューションで繰り返すことができます。