4

たとえば、LevelDBは複数ステートメントのトランザクションをサポートしていません。「トランザクションレイヤー」でそれらを処理する必要があるとどこかで読みました。

トランザクションをサポートしていない下位レベルのライブラリにトランザクション サポートを追加するために、この層は何をしなければならないでしょうか?

4

2 に答える 2

2

トランザクションを定義するにはさまざまな方法があり、それらを実装するにはさまざまな方法があります。トランザクションの一般的なプロパティは、ACID であることです。

  • 原子性- すべてかゼロか。データベース トランザクションのすべてのタスクを完了する必要があります。何らかの理由で不完全な場合は、データベース トランザクションを中止する必要があります。
  • 一貫性- シリアライズ可能性と整合性。データベースは、データベース トランザクションの前後で一貫した状態または正当な状態である必要があります。これは、データベース トランザクションがデータベースの整合性の制約を破ってはならないことを意味します。
  • 分離データベース トランザクションの実行中に使用されるデータは、実行が完了するまで、別のデータベース トランザクションで使用してはなりません。したがって、トランザクションが正常にコミットされるまで、不完全なトランザクションの部分的な結果を他のトランザクションで使用することはできません。また、トランザクションの実行が、他の同時トランザクションのデータベース操作の影響を受けないことも意味します。
  • 永続性トランザクションの完了後にシステム障害が発生した場合でも、トランザクションのすべてのデータベース変更は永続的になります。

トランザクションにはいくつかの状態があります。

  • アクティブ状態: 2 つのフェーズに分かれています。初期フェーズ: データベース トランザクションは、ステートメントの実行が開始されている間、このフェーズにあります。部分的にコミットされたフェーズ: データベース トランザクションは、最後のステートメントが実行されると、このフェーズに入ります。このフェーズでは、データベース トランザクションは実行を終了していますが、実行からの出力が一時的にメイン メモリに残っている可能性があるため、トランザクションが中止される可能性があります。ハードウェア障害などのイベントによって出力が消去される可能性があります。
  • 失敗状態: データベース トランザクションは、ハードウェアまたはプログラムのエラーが原因で通常の実行が続行できなくなったときに失敗状態になります)。
  • Aborted State : データベース トランザクションが DBMS によって失敗したと判断された場合、データベース トランザクションは中断状態になります。中断されたトランザクションはデータベースに影響を与えてはならないため、データベースに加えられた変更はすべて元に戻すか、技術的にはロールバックする必要があります。中止されたトランザクションがロールバックされると、データベースは一貫した状態に戻ります。DBMS の回復スキームは、トランザクションの中止を管理する役割を果たします。
  • コミット済み状態: データベース トランザクションは、実行が正常に完了した後、十分な情報がディスクに書き込まれると、コミット済み状態になります。この状態では、非常に多くの情報がディスクに書き込まれているため、トランザクションによって生成された結果はアボートによって元に戻すことができません。システム障害が発生した場合でも、コミットされたトランザクションによって行われた変更は、システムの再起動時に再作成できます。

LevelDB はトランザクションをサポートしていませんが、いくつかの ACID プロパティがあります。

  • バッチ書き込みはアトミックです。
  • 一貫性はあなた次第です。
  • 限定的な分離サポートがあります。
  • 耐久性は構成可能なオプションです。

だから...あなたの質問に戻ります:

Q:

トランザクションをサポートしていない下位レベルのライブラリにトランザクション サポートを追加するために、この層は何をしなければならないでしょうか?

A: トランザクションをどのように定義するかによって異なります。上記のプロパティを使用してトランザクションを定義し、トランザクションを ACID にしたい場合は、LevelDB でそれが可能かどうかを判断する必要があります (ほとんどの ACID プロパティは統合されています)。トランザクションの状態が適切に維持されることを保証する LevelDB のラッパーを作成します。ただし、ラッパーだけでそれができるかどうかは完全にはわかりません。そのため、トランザクションを真にサポートするには、実際にソース コードを取得して変更する必要があるかもしれません。

于 2012-01-27T16:55:58.560 に答える
2

データベースがシングル スレッドの場合、次の操作を実行できます。

  1. leveldb バッチ機能の使用: 古いキーをオーバーライドする代わりに、新しいキーを作成します。キーの古い値と新しい値もログに記録します。

  2. この時点でデータベースがクラッシュした場合は、ログ レコードを検索し、トランザクションの一部であったキーを元の値に復元して、トランザクションをロールバックします。ログを削除してロールバックを完了します。

  3. トランザクションがコミットされたら、古いキーを削除し、ログ エントリを削除してコミットを完了します。

次に、複数のバージョンを使用する単一スレッドのキー/値ストアのトランザクションがあります。

データベースがマルチスレッドの場合は、MVCC (Yahoo の Omid、PostgreSQL、Wiredtiger、bsddb を参照) や、Precisely Serializable Snapshot Isolation (PSSI) などを使用する必要があります。

于 2015-08-21T21:15:33.003 に答える