問題タブ [race-condition]
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.
java - file.createNewFile()は、実際の作成時刻より前に最終変更時刻のファイルを作成します
JPollerを使用して特定のディレクトリ内のファイルへの変更を検出していますが、実際の作成時刻よりも前のタイムスタンプで終わるため、ファイルが見つかりません。テスト方法は次のとおりです。
そして、これが私が出力のために得るものです:
結果は競合状態です:
- JPollerは最後のチェックの時間をxyzとして記録します...123
- xyzで作成されたファイル...456
- ファイルの最終変更タイムスタンプは実際にはxyz...000を読み取ります
- JPollerは、タイムスタンプがxyz...123より大きい新しい/更新されたファイルを探します
- xyz...000はxyz...123より小さいため、JPollerは新しく追加されたファイルを無視します
- しばらく髪を抜く
コードを掘り下げてみましたが、どちらlastModified()
もcreateNewFile()
最終的にはネイティブコールに解決されるため、情報がほとんど残っていません。
の場合test.9
、私は957ミリ秒を失います。どのような精度が期待できますか?結果はオペレーティングシステムやファイルシステムによって異なりますか?推奨される回避策は?
注:現在、XFSファイルシステムを使用してLinuxを実行しています。でクイックプログラムを作成しましC
たが、statシステムの呼び出しはst_mtime
として表示されtruncate(xyz...000/1000)
ます。
更新:NTFSを使用するWindows 7で上記と同じプログラムを実行しましたが、完全なミリ秒の精度が維持されます。MSDNリンク@mdmaは、FATファイルシステムが10ミリ秒の解像度で作成する場合は正確ですが、アクセスは2秒までしか正確ではないことをさらに示しています。したがって、これは本当にOSに依存します。
c# - ASP.NET:ビジネスロジックのレース条件の問題
私は次の問題を抱えています:
私たちのシステムには、リリースされたときにX回だけ購入できる製品があります。購入時に、中央購入アルゴリズムが存在する注文の数をチェックし、X未満の場合は購入を続行します。
疑似的なC#コードの場合:
問題は、特定の製品に対する需要が高い場合、同時に多くの要求が発生し、MAX_ORDERSを超えるものが登録されることがあるということです。これは約1年に1回発生します:(。
これを解決するための最良の解決策は何ですか?ASP.NET/C#、Ling2SQL、MSSQLを使用しています。1日あたり1000件以上の注文があります。注文は、要求された順序で処理されることが重要です。
私がこれまでに思いついた解決策:
1つのグローバルミューテックス?
次のようなアクセス関数を使用して、ハッシュテーブルに格納された製品ごとに1つのミューテックス。
/li>
ここで、mutexTblはハッシュテーブルです。ただし、ここでは、古いミューテックスを適切な方法で破棄する方法がわかりません。
OrderテーブルでT-SQLINSERTトリガーを使用して、注文の数を確認します。
CREATE TRIGGER Triggers_OrderInsertTrigger ON Orders AFTER INSERT AS IF/*注文数が多いかどうかを確認します*/BEGIN RAISERROR('Too manyorders'、16、1); ロールバックトランザクション; リターンエンド;
しかし、私はこれらの解決策のどちらもあまり好きではありません。これをどのように解決しますか?
java - jsp/サーブレット アプリケーションでの Java メソッドと競合状態
呼び出されたメソッドがdoSomething()
あり、このメソッドをマルチスレッド アプリケーションで使用したいとします (各サーブレットは HttpServlet から継承されます)。次の場合に競合状態が発生する可能性があるかどうか疑問に思っています。
doSomething()
静的メソッドではなく、値をデータベースに書き込みます。doSomething()
静的メソッドですが、データベースに値を書き込みません。
アプリケーションの多くのメソッドが競合状態またはダーティな読み取り/書き込みにつながる可能性があることに気付きました。たとえば、 Poll System があり、投票操作ごとに、特定のメソッドがその投票の単一のセル値を次のように変更します。
JSP/サーブレット アプリはこれらの問題を単独で解決しますか? それとも、すべて自分で解決する必要がありますか?
ありがとう..
mysql - トランザクションはMySQLのすべての競合状態の問題を停止しますか?
この状況を考えてみましょう。
- トランザクションを開始します
- auto_incrementキーを使用して20レコードをテーブルに挿入します
- 最初の挿入IDを取得します(たとえば
153
) - そのテーブル内のすべてのレコードを更新します。
id >= 153
- 専念
ステップ4は安全ですか?
つまり、別のリクエストがほぼ同時に着信し、上記のステップ2の後、ステップ4の前にさらに20レコードを挿入した場合、競合状態は発生しますか?
java - 競合状態を引き起こす長時間実行メソッド
私は休止状態で比較的新しいので、優しくしてください。実行時間の長いメソッド (最長 2 分) に問題があり、DB に格納されているオブジェクトのステータス フィールドの値を変更しています。以下の疑似コードは、私の問題を説明するのに役立ちます。
疑似コードについては、あまり説明する必要はありません。doSomethingAndTakeALongTime() を実行したいのですが、ステータスが「準備完了」の場合のみです。私の問題は、doSomethingAndTakeALongTime() が終了するまでに 2 分かかり、物のステータス フィールドへの変更が foo() を離れるまでデータベースに保持されない場合に発生します。そのため、別のユーザーがその 2 分間にリクエストを送信すると、if ステートメントは true と評価されます。
フィールドを更新してセッションを手動でフラッシュしようとしましたが、うまくいかなかったようです。私はここから何をすべきかわからないので、助けていただければ幸いです。
PS: 私の休止状態のセッションは春に管理されています。
c - このフラグのないシステムで O_NOFOLLOW をシミュレートする良い方法は何ですか?
をサポートしていないシステムでopen
安全にシミュレートできるようにしたいと考えO_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW
ています。私が求めていることをある程度達成することができます:O_CREAT | O_WRONLY | O_APPEND | O_NOFOLLOW
O_NOFOLLOW
しかし、競合状態が発生し、セキュリティ上の問題が発生する可能性があります。
touch
ユーザーだけが書き込むことができるダミーファイルを作成することを考えましたingのようなものでfilename
、lstat
チェックを行い、chmod
書き込みが終了した後に使用します(ファイルモードビットを修正するため)が、何か大きなものを見落とす可能性があります(たとえば、ファイルがfilename
存在する場合、通常のファイルではない場合、または既にシンボリック リンクである場合)。
どう思いますか?
javascript - JavaScriptの本当に奇妙な動作
次のコードがあります
最後のコードブロックでエラーが発生するという非常に奇妙な状況がいくつかありますが、印刷された位置msg.position
は、実際にはtxtArea.value.length
. これは 1% の確率でしか発生しません。これは、2 番目の if ステートメントでは 2 つが等しくなく、エラー メッセージを出力すると等しくなるような競合状態がコードに含まれているかのようです。
何か案は?
c - O_NOFOLLOW のシミュレーション (2): この他のアプローチは安全ですか?
これに対するフォローアップの質問として、ファイルに追加して、存在しない場合は作成したい場合の@cafの回答から構築される別のアプローチを考えました。name
これが私が思いついたものです:
- file と同じファイルシステムのシステム一時ディレクトリに、モード 0700 の一時ディレクトリを作成します
name
。 ファイルname
を読み取り専用で開きますO_CREAT
。name
シンボリックリンクであればOSが追従する場合があります。一時ディレクトリに一時ファイルを作成し、 to fileによって作成された一時ファイルを試行するために使用します。mkstemp
rename
mkstemp
name
ファイルname
を読み取り専用で開きますO_CREAT | O_EXCL
。name
一時ディレクトリ内の一時的な名前へのハード リンクの作成を繰り返し試みます。link
「リンクターゲットが存在します」(errno) 以外のエラーが原因で呼び出しが失敗した場合EEXIST
は、終了します。(誰かがやってきて、 のファイルを削除したのかもしれません。誰name
にもわかりません)。- (ハードリンク)で使用
lstat
します。temp_name
の場合S_ISLNK(lst.st_mode)
、終了します。 open
temp_name
書き込みおよび追加用 (O_WRONLY | O_APPEND
)。- すべて書き出す。ファイル記述子を閉じます。
unlink
ハードリンク。- 一時ディレクトリを削除します。
(ちなみに、これはすべて、私が取り組んでいるオープン ソース プロジェクトのものです。このアプローチの実装のソースは、ここで確認できます。)
この手順は、シンボリック リンク攻撃に対して安全ですか? たとえば、悪意のあるプロセスが、チェックname
中に inode が通常のファイルを表していることを確認し、その inode を、ハード リンクが新しいシンボリック リンクを指しているシンボリック リンクにすることは可能ですか?lstat
temp_name
悪意のあるプロセスが影響を与えることはできないと想定していますtemp_name
。
編集: link
ターゲットを上書きしないため、「プレースホルダー」の一時ファイルを作成することは、私がやりたかったことではありません。その後、コードを更新し、上記の手順を更新しました。
EDIT2:この問題name
の影響を受けやすいとは思わないファイルが存在しない場合は、ステップ 2 の代替手順を使用してファイルを作成しています。
EDIT3:一時的な空の通常のファイルの名前を に変更するよりもさらに優れています。これには、リンクを解除してからname
名前を変更する効果もあります。name
O_RDONLY | O_CREAT | O_EXCL
状態の POSIX 標準open
:
O_EXCL
とO_CREAT
が設定され、path
シンボリック リンクに名前が付けられている場合、シンボリック リンクの内容に関係なく、open()
失敗して に設定さerrno
れます。EEXIST
c++ - 関数内の静的オブジェクトは潜在的な競合状態を引き起こしますか?
次のコードに興味があります。
上記のコードで競合状態が発生する可能性はありますか? 具体的には、コンパイラは次の「舞台裏」に相当するコードを生成する可能性がありますか?
...この場合、2 つのスレッドがほぼ同時に MyFunction() を呼び出すと、_myArray が 2 回割り当てられ、メモリ リークが発生する可能性があります。
それとも、これはどういうわけか正しく処理されていますか?
php - Memcache - 値の一貫性を保ちながら値の有効期限を延長する方法は?
PHP のこの単純なコードを参照してください。
そして、インクリメントする「パート 2」が多くの独立したクライアントから呼び出され、それぞれが一意の ID を取得していると想像してください。
質問: 値の一貫性を維持しながら、値「id」の有効期限をどのように延長しますか? 一部のクライアントが値を増やしに来るたびに覚えておいてください。
この問題を解決するいくつかのアイデア:
速くなるようにしてください
しかし、ここでは get と set の間にタイム ホールがあり、その時点で他のクライアントが値を変更できます。(?)
セマフォを使用します。例:
あまり効果がない…
memcache_delete を使用します。
ドキュメンテーションには、2 回呼び出した場合に何が起こったのかが記載されていません。最初の呼び出しの有効期限を延長する必要がありますか?
最後の驚くべき例 (自分で試してみてください):
私を返します: