問題タブ [acid]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
transactions - 分散トランザクションはどのように機能しますか (MSDTC など)?
通常の ACID トランザクションがどのように機能するか、あいまいな方法で理解しています。ある種のコミットフラグが設定されるまで作業が確認されないように、データベースでいくつかの作業を実行します。コミット部分は、いくつかの基本的な仮定に基づいています (単一のディスク ブロックの書き込みがアトミックであるなど)。壊滅的なエラーが発生した場合は、リカバリ フェーズでコミットされていないデータを消去できます。
分散トランザクションはどのように機能しますか? MS のドキュメントのいくつかで、データベースとファイルシステム間で何らかの方法でトランザクションを実行できることを読みました (とりわけ)。
このテクノロジーは、プログラムを完全にインストールするか、完全に存在させないようにするインストーラーに使用できます (おそらく使用されています)。インストーラーの開始時にトランザクションを開始するだけです。次に、レジストリとファイルシステムに接続して、インストールを定義する変更を行います。ジョブが完了したら、単純にコミットするか、何らかの理由でインストールが失敗した場合はロールバックします。レジストリとファイル システムは、この魔法の分散トランザクション コーディネーターによって自動的にクリーンアップされます。
2 つの異なるシステムがこのように処理される可能性はありますか? ファイルシステムが変更をコミットし、レジストリがコミットしていないという、一貫性のない状態でシステムを放置することは常に可能であるように私には思えます。MSDTC では、ネットワークを介してトランザクションを実行することさえ可能だと思います。
http://blogs.msdn.com/florinlazar/archive/2004/03/04/84199.aspxを読みましたが、説明の冒頭に過ぎず、手順 4 を大幅に拡張する必要があるように感じます。
編集: http://en.wikipedia.org/wiki/Distributed_transactionで収集したものから、2 フェーズ コミット ( http://en.wikipedia.org/wiki/Two-phase_commit )によって実現できます。これを読んだ後でも、私はまだこの方法を 100% 理解していません。ステップ間にエラーの余地がたくさんあるようです。
sql - マルチプロセス書き込みのトランザクションカプセル化
複数のプロセスがテーブルに挿入し、単一のプロセスがそこから選択するデータベース シナリオ (私は Oracle を使用しています) があります。テーブルは基本的に中間ストレージとして使用され、複数のプロセス (以下ではライターと呼ばれます) がログ イベントを書き込み、そこから単一のプロセス (以下ではリーダーと呼ばれます) がさらに処理するためにイベントを読み取ります。リーダーは、テーブルに挿入されたすべてのイベントを読み取る必要があります。
現在、これは、挿入された各レコードに昇順の ID が割り当てられることによって行われます。リーダーは、以前に読み取ったブロックの最大 ID よりも ID が大きいエントリのブロックをテーブルから定期的に選択します。例:
このアプローチの問題は、ライターが同時に動作するため、行が昇順で割り当てられている場合でも、割り当てられた ID に従って行が常に順番に挿入されるとは限らないことです。つまり、id=100 の行は、id=110 のレコードの後に書き込まれることがあります。これは、id=110 の行を書き込むプロセスが、レコード id=100 を書き込むプロセスの後に開始されたが、最初にコミットされたためです。これにより、リーダーが id=110 の行を既に読み取った場合、id=100 の行が失われる可能性があります。
ライターにテーブルの排他ロックを強制すると、ライターが順次挿入し、リーダーが未処理のコミットを待機するようになるため、問題が解決します。ただし、これはおそらくそれほど高速ではありません。
私の考えでは、Reader は、未解決の Writer コミットを待ってから読み取るだけで十分です。つまり、すべてのライターが終了するまで、リーダーが読み取りを行っている限り、ライターは同時に動作し続ける可能性があります。
私の質問は次のとおり
です。ライター プロセスの未処理のコミットを待機するようにリーダー プロセスに指示するにはどうすればよいですか? 上記の問題に対する代替案も歓迎します。
database - sqlite3では、選択は挿入のトランザクション内で成功できますか?
テーブルに複数のレコードを挿入するトランザクションを開始します。トランザクションがコミットされる前に、データベースから最後に挿入されたレコードを選択できますか?
acid - ACID の実装
データベースに ACID セマンティクスを提供する必要があるプロジェクトの研究を開始しています。
データの性質上、一般的な市販のシステム (リレーショナルまたはキー値) での保存には適していません。
ACID セマンティクスを提供する必要があるシステムを実装する方法についての優れたリソースは何ですか?
私の典型的な Google 検索では、そのようなシステムの実装方法ではなく、既に ACID セマンティクスを提供しているシステムに関するより多くの情報が返されます。
.net - データベース外でトランザクションを実装するためのパターン
電子メールを送信し、ファイルに書き込み、Web サービスを呼び出す必要があります。一貫性を維持するには、すべてのステップを実行する必要があります。いずれかのステップで例外またはエラーがスローされた場合、すべてのステップをロールバックする必要があります。
独自のオブジェクト ACID エンジンを展開する前に、オブジェクト レベルで ACID セマンティクスを実装するための一般的に受け入れられているパターンはありますか?
さらに良いことに、.NET プラットフォームで使用できる既存のライブラリはありますか?
編集:電子メールの送信を元に戻せないことは知っていますが、SMTP サーバーへの接続に失敗すると、トランザクション全体が強制終了されます。また、将来のアクションで使用できるように拡張できるようにしたいと考えています。
database - ACIDの実際の例は何ですか?
データベースのさまざまなACIDプロパティの実際の例を探しています。
sqlite - 突然電源が落ちたり、OS がクラッシュした場合、SQLite3 のデータベース ファイルは破損しますか?
データベース ファイルを開き、sqlite3 の open() メソッドを使用してデータベース接続を取得すると、プログラムが終了するまで接続が閉じられません。コンピュータの突然の電源オフやOSのクラッシュなどの予期しないエラーが発生した場合、データベース ファイルのモードが破損したり、ハンドルが失われたりしませんか? より具体的には、コンピューターを再起動しても書き込み可能な状態を維持できますか? ところで、エラーが発生したときのデータ損失は気にしません。
どうもありがとうございました!
sql - 原子と耐久性のロールバック
私はデータベーストランザクションのACIDプロパティを理解しようとしています。どの部分が原子性で、どの部分が耐久性などです。
A
2つのアクションを持つトランクションがあるとしましょうB
。残念ながら、実行時にシステムの電源がオフになりましaction B
た。システムのリセット後、データベースはを実行する前の状態を(sqliteのロールバックジャーナルを介して)保持することがわかっていますaction A
。では、これはどのACIDプロパティ、原子性または耐久性を示していますか?
別のケース:実行action B
中にエラーが発生し、アプリケーションに通知され、アプリケーションがロールバックされたとします。これは、データベースエンジンではなく、ユーザーによって達成される純粋な原子性であると私は考えています。私は正しいですか?
crash - ディスク セクタの書き込みはアトミックですか?
明確化された質問:
OS がセクタをディスクに書き込むコマンドを送信するとき、それはアトミックですか? つまり、新しいデータの書き込みは完全に成功するか、書き込みコマンドの直後に電源が落ちた場合、古いデータはそのまま残ります。複数のセクターの書き込みで何が起こるかは気にしません - 破れたページは許容されます。
古い質問:
ディスク上に古いデータ X があり、その上に新しいデータ Y を書き込むと、その書き込み中に木が電力線に落ちるとします。派手な UPS やバッテリーでバックアップされたディスク コントローラがなければ、ディスク上のデータが一部 X と一部 Y である破れたページになってしまう可能性があります。 、一部ゴミ?
私はデータベースのような ACID システムの設計を理解しようとしてきましたが、私の素朴な考えでは、先行書き込みログを使用しない firebird は、特定の書き込みが古いデータを破壊しないことに依存しているようです (X) -新しいデータを完全に書き込めないだけです (Y)。つまり、X の一部が上書きされた場合、保持しようとしている X の部分ではなく、上書きされている X の部分のみを変更できます。
明確にするために、これは、保持したい半分Y、半分Xで満たされたページサイズのバッファ、たとえば4096バイトがある場合、OSにそのバッファをXに書き込むように指示した場合、深刻なディスク以外の状況はないことを意味します保持したい半分の X が書き込み中に破損するという障害。