問題タブ [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.
php - デッドロックとタイムアウトはACIDトランザクションを中断します
私は次のように機能するトランザクションアプリケーションを持っています:
そして、increaseNumber()内に、このようなクエリがあります。これは、このテーブルで機能する唯一の関数です。
すべてがトランザクションにラップされていますが、最近、かなり遅いクエリを処理していて、アプリケーションで多くの同時実行が行われているため、クエリが特定の順序で実行されることを実際に確認することはできません。
デッドロックによりACIDトランザクションが中断する可能性はありますか?何かを追加する関数とそれを削除する関数がありますが、デッドロックがあると、トランザクションが無視されたように、データが完全に同期していないことがわかります。
これは必ず起こるのでしょうか、それとも何か問題がありますか?
ありがとう、ドミニク
django - トランザクション、API、および失敗に対する設計
私は、外部 API の使用に依存するクレジット カード トランザクションをログに記録する必要があるアプリケーションに取り組んできました。私のアプリケーションには、合計を含む請求書と、クレジット カードによる支払いが成功したときにこの合計から差し引かれるトランザクションの概念があります。
これはプラットフォームに依存しない質問ですが、私は Django、Python、および MySQL を使用しています。
私の質問は主に、外部 API を処理する際のトランザクションの使用と、潜在的な障害を処理するためのソフトウェアの設計方法に関するものです。Django と MySQL の両方がトランザクションをサポートしているため、それ自体は問題ではありませんが、次のシナリオを想定します。
- 支払い API を介して送信されたクレジット カード
- クレジットカードは正常に処理されました
- この応答は、その請求書の支払いとしてデータベースに記録されます
- 何らかの理由で支払いをデータベースに保存する際にエラーが発生しました
これでどうしますか?
API 呼び出しが含まれていない場合、答えは明らかで、データベース トランザクションをロールバックしてエラーを発生させます。しかし、外部 API を呼び出すと、問題が複雑になります。これは、実際には外部 API 呼び出しをロールバックする方法ではないためです。
誰かがこの問題 (クレジット カード、または同様の種類のトランザクション) に遭遇したか、問題にどのように対処したか、またはこの場合のソフトウェア設計の一般的なアプローチに興味があります。
sql - v4より前のMongoDBがACIDに準拠していなかったとはどういう意味ですか?
私はデータベースの専門家ではなく、正式なコンピュータサイエンスのバックグラウンドも持っていないので、我慢してください。ACIDに準拠していないv4より前の古いバージョンのMongoDBを使用した場合に発生する可能性のある、実際のネガティブなことの種類を知りたいです。これは、ACIDに準拠していないデータベースに適用されます。
MongoDBはAtomicOperationsを実行できることを理解していますが、主にパフォーマンス上の理由から、「従来のロックと複雑なトランザクションをサポート」していません。また、データベーストランザクションの重要性と、データベースが銀行用であり、すべてを同期する必要がある複数のレコードを更新する場合の例を理解しています。停電なので、クレジットは購入と同じです。
しかし、MongoDBについて話し合うと、データベースが実際にどのように実装されているかについての技術的な詳細を知らない人は、次のようなステートメントを投げかけ始めます。
MongoDBはMySQLやPostgresよりもはるかに高速ですが、100万分の1のように、「正しく保存されない」可能性はわずかです。
「正しく保存されない」という部分は、この理解を示しています。MongoDBに書き込んでいる瞬間に停電が発生した場合、特定のレコードの可能性があります(たとえば、10個の属性を持つドキュメントのページビューを追跡している場合)それぞれ)、ドキュメントの1つは5つの属性しか保存していませんでした…つまり、時間の経過とともにページビューカウンターが「わずかに」オフになります。どれだけ正確かはわかりませんが、100%ではありません。これは、これを特にmongodbアトミック操作にしない限り、操作がアトミックであることが保証されないためです。
だから私の質問は、MongoDBが「正しく保存」されない場合とその理由の正しい解釈は何ですか?ACIDのどの部分が満たされていないのか、どのような状況で、データの0.001%がオフになっているのかをどのようにして知ることができますか?これはどういうわけか修正できませんか?そうでない場合、これはusers
、レコードが保存されない可能性があるため、テーブルなどをMongoDBに保存するべきではないことを意味しているようです。しかし、繰り返しになりますが、その1 / 1,000,000ユーザーは、「再サインアップを再試行する」必要があるかもしれませんね。
MongoDBのようなACID非準拠データベースでネガティブなことがいつ/なぜ発生するのか、そして理想的には標準的な回避策がある場合(データをクリーンアップするためにバックグラウンドジョブを実行する、またはこれにSQLのみを使用するなど)のリストを探しています。 。
database - 非 ACID データベース コンプライアンスの実際の影響は何ですか?
具体的には、データが失われるリスクはありますか? 私は、何も失われないことが重要な、集中的なトランザクション処理システムを実行しようとしています。銀行取引処理などのミッション クリティカルなアプリケーションで NoSQL が使用されている例はありますか?
php - 自動インクリメントされた主キーを別のテーブルに挿入するスレッドセーフな方法 (後で結合できるようにするため)
これには 2 つの方法があるようですが、最初の方法は次のようになります。
次に、関連するすべてのテーブルに $nextid を外部キーとして挿入できます。
もう 1 つの方法では、最後の挿入 ID を使用します。
これらは両方ともスレッドセーフですか? IE、2 つの mysql スレッドを同時に実行する 2 つの php スクリプトがあり、それらが同時にメイン テーブルに挿入される場合、関連付けられたテーブルは正しいプライマリ ID 外部キーを受け取りますか、それとも混乱や衝突が発生する可能性がありますか?
ありがとう。
rdbms - 一般的な ACID RDBMS はコミットごとにディスクに同期しますか?
ACID の 'D' は、ウィキペディアで次のように定義されている「耐久性」を意味します。
ただし、これは、フラッシュされるだけでなく、成功として報告される前に、すべてのトランザクションをディスクに同期する必要があることを意味します。(「flush」=オペレーティング システム レベルに送信、「sync」=物理ディスク プラッタに送信)。これにより、トランザクション レートの高い RDBMS を実装することができなくなります。
一般的な RDBMS は本当にすべてのトランザクションを同期しますか?
mongodb - 耐久性(モンゴ)なしでどのような操作順序保証がありますか?
ACID データベースがあるとします。操作の順序付けに関する明示的な保証がなくても、耐久性の結果として順序付けを推測できます。
例えば
- データベースに挿入
x
すると、ステートメントが返されます - 今、私は挿入します
y
- 耐久性保証のおかげで、私
x
は以前に耐久性が作られたことを知っていy
ます.
したがって、クラッシュが発生した場合、次のいずれかがあります。
- データベースにない、
x
またはy
データベースにない - それだけ
x
x
との両方y
。
ここで、耐久性の保証が緩和されたデータベースを想定します。たとえば、セーフモードまたは getlasterror のない MongoDB。
2 番目の操作が永続化される前に、最初の操作が永続化されるという保証はありますか?
これを主張するドキュメントの一部、または適切なテストを教えてください。
障害が発生した場合、データベースに を含めることはできますy
かx
?
EDIT:
デフォルトの(唯一の?)ストレージメカニズムはメモリマップファイルエンジンのようです。ジャーナリングを有効にしないと (現在はデフォルトで有効になっています)、サーバーがクラッシュすると、一貫性のない修復不可能な状態になる可能性があります。答えはジャーナリングの中にあると思います。
java - マルチスレッド環境でのACIDの問題
MySQLデータベースで多くの並列CRUD操作を実行するマルチスレッドJavaアプリケーションがあります。MySQLのマニュアルで読まれているように、InnoDBテーブル構造は、トランザクションがACIDの原則に従って実行されることを保証する必要があります。しかし、アップデートが失われることがあるため、まだ問題があります。これは、私が使用するストアドプロシージャの例の1つです。
java - マルチスレッド/接続を有効にして同じ mysql テーブルを変更する方法は?
2 つのスレッドが実行されているプログラムがあり、各スレッドには独自のデータベース JDBC 接続があり、以下のように同じデータベース テーブル A にアクセス/変更します。テーブル A には 2 つの列 (id、name) しかなく、主キーは id と name の組み合わせです。
2 つのスレッドが同じデータをテーブルに挿入する可能性があり、次の例外が発生しました。
この問題を解決する方法を教えてください。ありがとうございました。
よろしく、ジョーイ
c - これらの要件をすべて満たすオープンソース データベースはどれですか?
DB への読み書き用の C API をサポートします。
ACID トランザクション機能をサポートします。
DB の状態が変化した場合の通知の送信をサポートします。
最後に、オープン ソースにする必要があります。
上記のすべての機能をサポートするオープン ソース データベースを誰かが提案できますか。