問題タブ [concurrency]
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.
sql-server - トランザクションレベル、nolock/readpastおよび同時実行性
複数のステーションから大量のデータを同時に挿入すると同時に、データクエリインターフェイスを公開するシステムがあります。スキーマは次のようになります(フォーマットが不適切なため申し訳ありません)。
データの挿入は「同期」で行われ、次のようになります(システムにデータを挿入するだけで、更新することはありません)
そして、クエリは次のようになります(特定のステーション、測定時間、およびデータ型に対して)
私の質問は、挿入のトランザクションレベルとクエリのNOLOCK/READPASTヒントをどのように組み合わせて次のようにすることができるかです。
- 挿入を優先しながら、システムの同時実行性を最大化します(大量のデータを保存する必要があり、1秒あたり2000以上のレコードが必要です)
- クエリは、「コミットされた」同期からのデータのみを返します(半分挿入された同期、またはロックスキップのためにスキップされたエントリとの同期を含む結果セットは必要ありません)
- 「最新の」データがクエリに含まれているかどうかは関係ありません。「ライブ」で最新のデータよりも一貫性と応答性を重視します。
これは非常に相反する目標であり、高いトランザクション分離レベルが必要になる場合がありますが、挿入と選択の両方で高い応答性を実現するためのすべてのトリックと最適化に関心があります。より多くの微調整やトリックを洗い流すためにさらに詳細が必要な場合は、喜んで詳しく説明します。
更新:将来の返信のためにもう少し情報を追加するだけです。最初は5TB以上のストレージを備えたSANネットワークでSQLServer2005(おそらく6か月以内に2008年)を実行しています。SAnが設定されているRAIDの種類と、使用可能なディスクの正確な数がわかりません。
sql-server - 1K ID を作成し、同時実行を考慮してすべての行に transactionID を割り当てる
- クライアントは、サーバーから 1K 行の ID を要求します。
- clientID = -1 の 1K の ID があることを確認する必要があります。そうでない場合は、1K の新しい ID をテーブルに挿入する必要があります。
- 次に、これらの 1K ID を clientID にリンクする必要があります
- 予約済みの 1K ID をクライアントに返します。
これらすべてをトランザクションにラップするのと同じくらい簡単ですか?
sqlite - SQLiteの非排他予約ロック?
特にトランザクションに関して、サイトの SQLite パフォーマンスを改善することを検討しています。本質的に、私が探しているのは、データベースへの書き込みをプロセス内で延期して、すべてを一度に実行できるようにする方法です。ただし、更新クエリを蓄積している間、他のプロセスがデータベースからの読み取りと書き込みの両方を実行できるようにし、プロセスでコミットが発行されたときにのみ書き込み用にファイルをロックしたいと考えています。
ドキュメントを見ると、トランザクションで更新コマンドが発行されると、プロセスは RESERVED ロックを取得するように見えます。これは、(私の記憶が正しければ) 更新クエリを独自のトランザクションに追加しようとする他のプロセスを意味します。またはトランザクションをコミットすることはできないため、トランザクションがロックされたプロセスでコミットされるまでブロックされます。
この特定の機能には、データの整合性に関する非常に優れた理由があると確信しています。私が言えることは、私の場合、これらの更新を同時に実行しても危険はないということだけです。
1 つの解決策は、各プロセスで呼び出したいクエリのテキストを配列に蓄積し、書き込みの準備ができたらループダウンすることですが、SQLite トランザクションを実行できるかどうか疑問に思っています。これを自動的に行ってください。
更新:「すべての更新を一度に行う」というのは、基本的に SQLite でトランザクションを使用して、クエリごとではなく、プロセスごとに 1 回だけ排他ロックを取得してディスクに書き込むことです。これにより、SQLite を使用すると 100 倍のスピードアップが実現します。
いくつかの基本的なテストを行ったところ、トランザクションにクエリを追加する複数のプロセスがあると、そのプロセスが RESERVED ロックを取得しようとする更新クエリにヒットしたようです。予約されたロックを持つことができるプロセスは 1 回だけであるため、ロックを取得しようとする他のプロセスは、ロックを持つプロセスがトランザクションを終了するまでブロックされます。
私はまだパフォーマンスの低下に遭遇していないので、この問題は時期尚早の最適化である可能性があることを認めますが、いくつかの簡単なテストを実行し、100 人のユーザーがそれぞれ 100 個のクエリを使用してトランザクションを作成および実行するのに、私のマシンの PHP で約 4 秒かかりました。
php - PHP と同時ファイル アクセス
いくつかの情報をプレーンテキストファイルに保存する小さな Web アプリを PHP で構築しています。ただし、このテキスト ファイルは、特定の時点でアプリのすべてのユーザーによって使用/変更され、同時に可能です。
質問はそうです。特定の時点で 1 人のユーザーだけがファイルを変更できるようにする最善の方法は何でしょうか?
c# - 共有書き込み用にファイルを開く
次のコードは、私の問題を示す単純な例です。
ここでの問題は、このメソッドを 10 回呼び出しても、通常は 1 つのエントリしかファイルに入らないことです。共有を許可するには、ファイルを開く必要があります。私が知る限り、例外はスローされません。どうしたの?
この例が隠している実際のコードでは、DoWork への各呼び出しは実際には個別のプロセスにありますが、テストでは結果は同じであることが示されています。ここで修正できる場合は、そこで修正できます。
sql - DB テーブルをジョブ キュー (別名バッチ キューまたはメッセージ キュー) として使用する最良の方法
〜50K行のデータベーステーブルがあり、各行は実行する必要があるジョブを表しています。DBからジョブを抽出し、ジョブを実行して結果をdbに戻すプログラムがあります。(このシステムは現在稼働中です)
ここで、複数の処理タスクがジョブを実行できるようにしたいのですが、タスクが 2 回実行されないようにします (これが他の問題を引き起こすのではないというパフォーマンス上の懸念から)。アクセスはストアド プロシージャを介して行われるため、私の現在の方法は、ストアド プロシージャを次のようなものに置き換えることです。
ところで; ワーカーのタスクは、ジョブの取得と結果の送信の間の接続を切断する可能性があります。また、その部分を台無しにしない限り、DBがボトルネックに近づくことさえないと思います(1分あたり〜5ジョブ)
これに問題はありますか?これを行うより良い方法はありますか?
注: 「IPC アンチパターンとしてのデータベース」は、ここでは少しだけ適切です。
- 私はIPCを行っていません(行を生成するプロセスはありません。現在、それらはすべてすでに存在しています)
- そのアンチパターンについて説明されている主な不満は、プロセスがメッセージを待機するときにDBに不要な負荷がかかることです(私の場合、メッセージがない場合、すべてが完了するとすべてがシャットダウンする可能性があります)
java - リストを並べ替えると、そのイテレータはどうなりますか?
そのリストのオブジェクトとイテレータがあるList
としましょう。
今、私はリストを並べ替えますjava.util.Collections.sort()
- イテレータはどうなりますか?
- その動作はまだ定義されており、引き続き使用できますか?
- そうでない場合、リストのイテレータの破棄を防ぐことはできますか?
この問題は、プログラムの設計を変更したり、リストのクローンを作成したりすることで回避できることはわかっていますが、特にJavaの「公式」な動作を知りたいと思います。
java - Java同時実行シナリオ-同期が必要かどうか?
これが取引です。私は「プログラムコード」と呼ぶデータを含むハッシュマップを持っています。それは次のようにオブジェクトに存在します。
たくさんのリーダースレッドがあり、それぞれがgetValidProgramCodes()を一度呼び出してから、そのハッシュマップを読み取り専用リソースとして使用します。
ここまでは順調ですね。ここが私たちが面白くなるところです。
有効なプログラムコードの新しいリストを頻繁に生成し(方法は気にしないでください)、setValidProgramCodesを呼び出すタイマーを設定したいと思います。
私の理論(検証するために助けが必要です)は、明示的な同期を行わなくても、コードをそのまま使用し続けることができるというものです。これは次のようになります。validProgramCodesが更新されるとき、validProgramCodesの値は常に適切です。これは、新しいハッシュマップまたは古いハッシュマップへのポインターです。 これは、すべてが左右される前提です。 古いハッシュマップを持っている読者は大丈夫です。解放するまでガベージコレクションされないため、古い値を引き続き使用できます。各リーダーは一時的なものです。それはすぐに死に、新しい価値を手に入れる新しいものに置き換えられます。
これは水を保持しますか?私の主な目標は、更新が行われていない圧倒的多数のケースで、コストのかかる同期とブロックを回避することです。更新は1時間に1回程度で、読者は常にちらつきます。
asp.net - シングルトン vs キャッシュ ASP.NET
シングルトンである .NET でレジストリ クラスを作成しました。どうやら、このシングルトンはキャッシュに保持されているかのように動作します (シングルトン オブジェクトは各セッションで使用できます)。これは、このシングルトンをキャッシュに追加することの良い習慣ですか? + GetInstance() 関数の同時実行の問題に注意する必要はありますか?
.net - 別のプロセスで .net コードを実行する
Sharepoint に関連する偽装シナリオでは、別のプロセスでいくつかのコードを実行する必要があります (プロセスは特定のユーザーのコンテキストで実行されます)。別のアプリケーションを起動したくありません。基本的には、メソッドだけで「run as」を実行したいのです。