4

ACID トランザクションを行うための nodejs 用の TokuMX ドライバーをご存知ですか?

MongoDB の一種である Databaseengine TOKUMX を使用したいと思います。これは MongoDB のフォークのようなもので、mongo と同じ API を使用しますが、実際の ACID トランザクションを使用するという改善点がいくつか組み込まれています。ネイティブ形式の MongoDB は ACID を許可しません。しかし、TOKUMXはそうです。

だから、私は自分のAPPをNodejsで書いています。TokuMX データベースと通信するために必要なドライバーには、node-mongolianを使用します。良いニュースは、そのドライバーを使用してすべてのコマンドをデータベースに送信できることです。例えば:

nodeJS コードで:

mycollectionblabla.runCommand('beginTransaction', function(err, res) { ....
mycollectionblabla.insert .... 
mycollectionsblabla.runCommand('commitTransaction', function(err4, res4){...

問題は、そのプログラム コードを 10 回のように数回非常に高速に呼び出すと、ACID トランザクションが実行されないことです。そして、それは

runCommand('beginTransaction'... 

並行して、そしてもちろん

runCommand('commitTransaction', ...

失敗します!!! それは言うからです:トランザクションはすでに存在し、コミットするトランザクションが存在しないとも言っています... !!!

私を悩ませている問題がわかりますか?この問題を解決して ACID トランザクションを作成するにはどうすればよいですか?

ACID トランザクションを行うための nodejs 用の TokuMX ドライバーをご存知ですか?

4

1 に答える 1

5

node.js の動作方法と TokuMX マルチステートメント トランザクションの動作方法には根本的な問題があります。

TokuMX では、コマンドを実行するクライアント接続にマルチステートメント トランザクション ( beginTransaction) が関連付けられます。その後、次のコマンドrollbackTransactionまたはcommitTransactionコマンドまで、同じ接続で実行されたすべての操作は、トランザクションの一部としてカウントされます。

トランザクションを開始し、他のスレッドが接続を使用する場合、その操作はトランザクションの一部になります。また、スレッドを開始してから別の接続に切り替えると、切り替え後の操作はトランザクションに適切に関連付けられません。

このモデルを選んだ理由は、大多数のドライバーにとって理にかなっているからです。接続プールを使用する明示的なスレッド モデルを備えた言語のほとんどのドライバーには、特定の実行スレッド用に接続を予約するドライバー メカニズムあります。これらのドライバーでは、TokuMX トランザクションを使用するスレッドは、そのような予約された接続のコンテキスト内で使用する必要があります。

node.js では、現在のドライバー (現時点では知る限り) では、コードの論理グループを単一のトランザクションに排他的に関連付ける方法はありません。これは、node.js 実行モデル自体に、コードの論理グループを (複数のコールバックを介して) 接続を関連付けることができる「スレッド」として結び付けるという適切な概念がないためです。簡単に言えば、ノードに「beginTransactionコマンドを実行し、誰もこの接続を使用していないことを確認し、コールバックを呼び出すときは、接続への参照を取得して、それをより多くのことに使用できるようにする」ように指示する方法はありません。

現在、複数ステートメントのトランザクションを除外すると、node.js ドライバーを使用して TokuMX から取得できる一連のトランザクション セマンティクスが引き続き存在します。すべてのクエリは引き続き MVCC スナップショットを使用し、すべてのバッチ挿入、および複数ドキュメントの更新と削除は相互にシリアライズ可能に分離され、複数のドキュメント間でもアトミックです。これらはシャード設定では緩和されていることに注意してください。現時点では、トランザクション セマンティクスはシャード境界を越えません。

この問題に取り組んでいると伝えられている人物によるプロジェクトBlueRival/node-tokumx-nativeがあります。彼らの github の問題の 1 つによると、彼らはすぐにこの問題に取り組み始めるはずですが、私は彼らと直接連絡を取っているわけではないので、スケジュールや計画について話すことはできません。

今のところ、別のドライバーを使用するか、TokuMX の単一ステートメントのトランザクション セマンティクスで十分な方法でアプリケーションを作成することをお勧めします。

免責事項: 私は TokuMX のエンジニアです。

于 2014-05-23T17:29:27.737 に答える