たとえば、LevelDBは複数ステートメントのトランザクションをサポートしていません。「トランザクションレイヤー」でそれらを処理する必要があるとどこかで読みました。
トランザクションをサポートしていない下位レベルのライブラリにトランザクション サポートを追加するために、この層は何をしなければならないでしょうか?
たとえば、LevelDBは複数ステートメントのトランザクションをサポートしていません。「トランザクションレイヤー」でそれらを処理する必要があるとどこかで読みました。
トランザクションをサポートしていない下位レベルのライブラリにトランザクション サポートを追加するために、この層は何をしなければならないでしょうか?
トランザクションを定義するにはさまざまな方法があり、それらを実装するにはさまざまな方法があります。トランザクションの一般的なプロパティは、ACID であることです。
トランザクションにはいくつかの状態があります。
LevelDB はトランザクションをサポートしていませんが、いくつかの ACID プロパティがあります。
だから...あなたの質問に戻ります:
Q:
トランザクションをサポートしていない下位レベルのライブラリにトランザクション サポートを追加するために、この層は何をしなければならないでしょうか?
A: トランザクションをどのように定義するかによって異なります。上記のプロパティを使用してトランザクションを定義し、トランザクションを ACID にしたい場合は、LevelDB でそれが可能かどうかを判断する必要があります (ほとんどの ACID プロパティは統合されています)。トランザクションの状態が適切に維持されることを保証する LevelDB のラッパーを作成します。ただし、ラッパーだけでそれができるかどうかは完全にはわかりません。そのため、トランザクションを真にサポートするには、実際にソース コードを取得して変更する必要があるかもしれません。
データベースがシングル スレッドの場合、次の操作を実行できます。
leveldb バッチ機能の使用: 古いキーをオーバーライドする代わりに、新しいキーを作成します。キーの古い値と新しい値もログに記録します。
この時点でデータベースがクラッシュした場合は、ログ レコードを検索し、トランザクションの一部であったキーを元の値に復元して、トランザクションをロールバックします。ログを削除してロールバックを完了します。
トランザクションがコミットされたら、古いキーを削除し、ログ エントリを削除してコミットを完了します。
次に、複数のバージョンを使用する単一スレッドのキー/値ストアのトランザクションがあります。
データベースがマルチスレッドの場合は、MVCC (Yahoo の Omid、PostgreSQL、Wiredtiger、bsddb を参照) や、Precisely Serializable Snapshot Isolation (PSSI) などを使用する必要があります。