問題タブ [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.
database - ACID とデータベース トランザクションはどのように機能しますか?
ACID とデータベース トランザクションの関係は?
ACID はデータベース トランザクションを提供しますか、それとも同じことですか?
誰かがこのトピックを啓発できますか。
atomic - メモリ マップされたファイルと単一ブロックのアトミック書き込み
通常の IO API を使用して 1 つのファイルを読み書きすると、書き込みはブロック単位でアトミックであることが保証されます。つまり、私の書き込みが 1 つのブロックのみを変更する場合、オペレーティング システムは、ブロック全体が書き込まれるか、まったく書き込まれないことを保証します。
メモリ マップト ファイルで同じ効果を得るにはどうすればよいですか?
メモリ マップされたファイルは単なるバイト配列であるため、バイト配列を変更すると、オペレーティング システムはいつ書き込みが「完了」したと見なされるかを知る方法がないため、(可能性が低いとしても) メモリをスワップ アウトする可能性があります。ブロック書き込み操作の途中で、実際には半分のブロックを書き込みます。
ある種の「クリティカル セクションに入る/残す」、または書き込み中にファイルのページをメモリに「固定」する方法が必要です。そのようなものは存在しますか?もしそうなら、それは一般的なPOSIXシステムとWindowsで移植可能ですか?
database - 基本的なデータベースの質問?
データベースについて、現在知っていることよりももう少し知りたいと思っています。たまたま作成しているWebアプリケーションのデータベースバックエンドをセットアップする方法は知っていますが、それだけです。たとえば、3 つの異なるアプリを作成する場合は、3 つの異なるデータベースを作成し、特定のアプリ用に各データベースを構成します。これはすべて簡単な知識であり、データベースが実際にどのように機能するかをより深く理解したいと思います.
たとえば、大量のスペースと処理能力を必要とするアプリケーションを開発したとします。このデータベースは多数のマシンに分散する必要があります。データベースが多数のマシンに分散されていても、レコードを書き込んで取得できるとはどういうことでしょうか。各テーブルには独自のマシンがあり、さまざまなマシンがすべてトランザクションを正常に実行するために必要なソフトウェアは何か。
ご覧のとおり、私はかなりデータベースに無知です笑。
これを解決するための助けをいただければ幸いです。
.net - シンプルなバルクデータ永続化フレームワーク
バルクデータの永続性のためのACIDフレームワークはありますか?これにより、いくつかの基本的な検索機能も可能になりますか?私は本格的なDBMSを探しているのではなく、高速で軽量でシンプルなものを探しています。停電の場合にこれを再発明することを避けるために、アトミックコミットを処理するだけの何かでさえ素晴らしいでしょう。
SQL Serverはこれには遅すぎてオーバーヘッドが多すぎますが、SQLiteはさらに遅くなります(オーバーヘッドが少なくなる可能性がありますか?)。
基本的に、毎秒大量のタイムタンピングされたデータを保存する必要があります。正規化されたデータとして、これは約10kのテーブル行に対応しますが、バイナリデータとしては、約200kbを使用して表すことができます。明らかに、200kbをディスクに書き込むことは、10k行をリレーショナルデータベースに書き込むことと比較して簡単です。
単純に1つ以上の大きなバイナリファイルに永続化してから、独自のインデックスを実装して特定のフィールドでの高速フィルタリングを可能にすることもできますが、私を怖がらせるのは非アトミックトランザクションと読み取り/書き込みロックシナリオだけです。
何かお勧めはありますか?私はC#btwを使用しているので、.NETラッパーを使用するものが優先されます。
[編集] ACIDに関して、私はこれを見つけました。たとえば、トランザクションNTFSのマネージラッパー(TxFは「Vista以降」の機能ですが)。
python - ACID がデータベースで行うのと同じ安全性を持つ Python の書き込み関数
タイトルはおそらくもっとうまく付けられたかもしれませんが、とにかく。データベースの ACID プロパティに似た、ファイルへの書き込み機能があるかどうか疑問に思っていました。理由は、電源が切れた場合に、私が行っているファイルの書き込みが混乱したり、ファイルが破損したりしないようにしたいからです。
c# - NHibernate.Event.IPostDeleteEventListener がトランザクションでうまく機能しない
ディスク上のファイルにバインドされたバイナリ データを保持する NHibernate マップ クラスがあります。ビジネス ロジックは非常に単純です。
- オブジェクトがデータベースに格納されると、オブジェクト ID に一致する適切な名前のファイルに BLOB が書き込まれます。
- オブジェクトが DB から読み込まれると、ブロブはファイルの内容で満たされます
- オブジェクトがDBから削除されると、ファイルも削除されます
IPostDeleteEventListener を使用して 3 つの状況を処理しました
唯一の問題は、何らかの理由でSession.Delete()
、ファイルが既に削除された後にトランザクションがロールバックされたが、レコードが DB に保持された場合、アプリケーションが削除されていないオブジェクトを (再) ロードしようとすると FileNotFoundException が発生することです。
また、大したことではありませんが、挿入後にトランザクションがキャンセルされると、ガベージ ファイルが生成されます。
トランザクションがコミットされているときにのみ、これらのファイル システム操作を実行するにはどうすればよいですか?
[追加] たぶん... たぶん、回避策を見つけたと言いました。インターフェイスは、インターフェイスを引数として受け入れるメソッドをITransaction
公開します。RegisterSynchronization
回避策になる可能性があります。トランザクションの完了後にのみファイルを保存/削除します。もっと調査する必要がありますが、NHibernate イベント リスナー サブシステムから直接コミット/ロールバックするように設計された方法はないようです。
mysql - MySql InnoDB データベースでの低速クエリの最適化
実行速度が非常に遅いクエリを含む MySql データベースがあります。パフォーマンスを向上させるために最善を尽くしていますが、ここで何が間違っているのかわかりません。たぶんあなたはできる?
クエリ:
tablea.d=100 で 1500 行が得られ、(tablea.d=tableb.d OR tableb.d=1) で 1600 行が得られる場合、このクエリの実行には約 10 秒かかります。これは本当に遅いようです。もっと速くする必要がありますが、何が間違っているのかわかりません。
MySql EXPLAIN の出力:
php - mysql データベース要求を同期する方法は?
ジョブを実行するためにフェッチされるテーブルに多くのエントリがあります。これは、複数のサーバーにスケーリングされます。
サーバーが一連の行をフェッチして独自のジョブ キューに追加するときは、他のサーバーがフェッチしないように「ロック」する必要があります。更新が実行されると、タイムスタンプが増加し、「ロック解除」されます。
私は現在、ジョブサーバーのIDでデフォルトでnullに設定されているテーブルの「ジョブサーバー」と呼ばれるフィールドを更新することでこれを行っています。
ジョブ サーバーは、フィールドが null の行のみを選択します。
すべての行が処理されると、タイムスタンプが更新され、最後にジョブ フィールドが再び null に設定されます。
だから私はこれを同期する必要があります:
すべてのサーバーは上記を無限ループで実行します。フィールドが返されない場合、すべてが 2 日付 (最後の更新が 24 時間以内) であり、10 分後に送信されます。
私は現在 MyIsam を持っていますが、私の場合は innodb よりもパフォーマンスがはるかに優れていたので、そのまま使用したいと思っていますが、innodb には ACID トランザクションがあると聞きました。
そのため、選択と更新を1つとして実行できました。しかし、それはどのように見えて機能するのでしょうか?
問題は、他のプロセスが読み取り/書き込みを行う必要があり、ロックできないため、テーブルなどをロックする余裕がないことです。
また、共有セマフォなどのより高いレベルのソリューションにもオープンです。問題は、同期が複数のサーバーにまたがる必要があることです。
アプローチは一般的に正気ですか?あなたはそれを違うようにしますか?
ジョブ selectino を同期して、2 つのサーバーが同じ行を更新しないようにするにはどうすればよいですか?
mongodb - NoSQL データベースが処理できないタスクの例 (ある場合)
NoSQL の世界をテストしたいと思います。これは単なる好奇心であり、(まだ) 絶対的な必要性はありません。SQL データベースと NoSQL データベースの違いについていくつか読んだことがあります。潜在的な利点については確信していますが、NoSQL が適用されない場合が少し心配です。私が理解している場合、NoSQL データベースには基本的に ACID プロパティがありません。
ACID リレーショナル データベースで処理できる実世界の操作 (たとえば、電子商取引サイト、科学アプリケーションなど) の例を誰かが挙げることができますか?競合状態または停電などのため?
完璧な例は、データベース エンジンを変更しないと回避策がない場合です。NoSQL データベースのパフォーマンスが悪い例は、最終的には別の問題になりますが、ここでは、理論的にはそのようなテクノロジを使用できない場合を確認したいと思います。
おそらく、そのような例を見つけることはデータベース固有のものです。この場合、NoSQL の世界を表すために MongoDB を取り上げましょう。
編集:この質問を明確にするために、特定のケースではどの種類のデータベースが優れているかについて議論したくありません。SQL データベースが提供するある種の機能をどれだけ試しても、nosql ストアの上に実装できないため、このテクノロジが場合によっては絶対的な行き止まりになる可能性があるかどうかを知りたいです。多くの nosql ストアが利用可能であるため、サポートとして既存の nosql ストアを選択することを受け入れることができますが、私が最も興味を持っているのは、より高いレベルの機能を実装できるようにするためにストアが提供する必要がある機能の最小サブセットです (トランザクションをX を提供しないストア...)。
database - データベースの耐久性とパフォーマンス
私はデータベースで耐久性がどのように達成されるかをたくさん研究しました、そして私がよく理解すればそれはこのように機能します(単純化された):
クレントの視点:
- トランザクションを開始します。
- テーブル値に挿入...
- トランザクションのコミット
DBエンジンの観点:
- トランザクション開始インジケーターをログファイルに書き込みます
- クライアントによって行われた変更をログファイルに書き込みます
- トランザクションコミットインジケーターをログファイルに書き込みます
- ログファイルをHDDにフラッシュします(これにより、データの耐久性が保証されます)
- クライアントに「OK」を返します
私が観察したこと:
クライアントアプリケーションはシングルスレッドアプリケーション(1つのデータベース接続)です。私は400トランザクション/秒を実行できますが、ファイルに何かを書き込んでからこのファイルをHDDにfsyncする簡単なテストでは、150同期/秒しか実行されません。クライアントがマルチスレッド/マルチ接続の場合、DBエンジンがトランザクションをグループ化し、いくつかのトランザクションごとに1つのfsyncを実行すると想像しますが、そうではありません。
私の質問は、たとえばMsSQLが、トランザクションのコミットごとにログファイル(fsync、FlushFileBuffersなど)を実際に同期するのか、それとも他の種類の魔法の背後にあるのかということです。