問題タブ [optimistic-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.
meteor - Meteor で使用されている同時実行制御手法とは
私はMeteorにかなり慣れていませんが、面白いと思いました。
Meteor がリアルタイムで同時実行制御を行うために使用する基本的な手法またはアルゴリズムは何ですか? また、それが競合に対してどのように機能するのでしょうか? オペレーショナル トランスフォーメーション (OT) に基づいているのか、それとも他の何かに基づいているのか? また、Meteor のアーキテクチャを知っておくと役立ちます。
python - GET と INCR を使用した redis による楽観的ロック
コードのブロックを楽観的に「ロック」したい。擬似コードは次のとおりです。
INCR と GET の両方がアトミックであるため、これは問題ないように見えます。このアプローチに問題はありますか?
java - メソッドの同時呼び出しの検出
私はクラスシリアライザーを持っています:
目的は、actual が一度に 1 つのスレッドから実行されるようにすることです。ただし、ロックを保持している間にコールバックを呼び出すことは一般的に危険であるため、ロックを保持する代わりに、呼び出し元が着信値をキューに入れると、スレッドの 1 つが入り、キューを空にし、実際のコンシューマーをループで順番に呼び出します。(その他の制限は、同時呼び出し元の数がわからないことです。)
これは機能し、無制限のキュー、スレッド ホッピング、ループ内でスタックするスレッドの問題を回避しますが、ベンチマークでは、直接メソッド呼び出しと比較して、シングル スレッドのケースで 10% のスループットが得られます。I. 同期ブロックを使用してこのキューイング/発行を実装すると、JVM が同期化を最適化しないため、ベンチマークは直接ケースの 50% を示します。これは素晴らしいことですが、スケールも大きくありません。juc.Lock を使用するとスケーリングしますが、上記のコードと同様にシングルスレッドのスループットが低下します。私が間違っていなければ、JVM が最適化されて同期化された後でも、メソッドが再び同時に呼び出されてロックが元に戻された場合に備えて、何らかのガードを使用する必要があります。
私の質問は、ロック、キュー、またはその他のシリアル化ロジックで同様の効果を達成するにはどうすればよいかということです。コードはスケーリングされ、シングル スレッドでの使用でも高速のままです。
c# - ajax またはその他のメカニズムを介してデータの変更をユーザーに通知する
同じページを変更しているユーザーに、Excel グリッド SPA が更新されたことを通知する必要があります。日付変更のタイムスタンプを前後に渡すことを考えていました。オリジナルがデータベース内の現在のものから過去のものである場合、グリッドが他の誰かによって更新されたことを意味します。これを行うより良い方法はありますか?
java - 楽観的なロックとオーバーライド
バージョンベースの楽観的ロックが「last-commit-wins」の問題と適切なオーバーライドを防ぐ方法を理解しようとすると、問題が発生します。
質問をより具体的にするために、JDBC を使用する次の疑似コードを考えてみましょう。
ここで、更新とコミットの間に他のトランザクションがその変更をコミットするとどうなるでしょうか? トランザクションが並行している場合、最初のトランザクションによって行われた更新はまだコミットされていないため、(適切な分離レベルで) 2 番目のトランザクションには表示されないため、最初のトランザクションのコミットは、通知や通知なしに 2 番目のトランザクションの変更をオーバーライドします。エラー。
これは、楽観的ロックが問題の可能性を減らすだけで、一般的にそれを防ぐわけではないということですか?
php - Doctrine2 の楽観的ロックは、多対多の関係では機能しません
User
ロールと多対多の関係を持つエンティティがあります。オプティミスティック ロックを実装しようとしましたが、すべて正常に動作します。役割を変更しただけで、バージョン (ユーザー エンティティのバージョン) は変更されません。これは適切な動作ですか?
ravendb - 複数のクライアントに対するオプティミスティック同時実行チェックを使用したイベント ストアの実装
私が見たグレッグ・ヤングにインスパイアされたさまざまな例に沿った実践と原則を使用して、イベントソーシングシステムを実装しようとしています。
バージョン チェック ロジックのしくみと、集計を保存するときに、現在のバージョンが予想されるバージョンと一致しない場合は、別のセッション/クライアント アプリが集計を更新する前に更新したことを意味することを理解しています。
また、同時イベントが保存されたときに競合をさかのぼって解決する方法を用意できることも理解しています。この質問は、これを行うことではありません。
私が理解しようとしているのは、ravendb などの nosql データベースをイベント ストアとして使用する特定の実装では、競合状態のために書き込まれたイベントがバージョン番号と重複しないようにするにはどうすればよいかということです。
サンプル プロジェクトからの次のコードを示します。
Repository<TAggregate>
リポジトリ クラスには save メソッドがあります
基本的に、アプリケーションが 1 つしかない場合、これは問題なく機能します。ロックは、現在のスレッドがロックを取得し、バージョンをチェックしてから、独自のイベントを書き込んでいる間、他のスレッドがイベント ストアにイベントを書き込んでいるのを停止します。
ただし、異なるマシンで実行されている 2 つの別個のクライアントを想像してみてください。明らかに、2 つのプロセスは両方とも一緒にロックされ、GetById()
メソッドを実行して、現在コミットされている同じバージョンを確認できます。両方のプロセスは、バージョン番号をインクリメントして、コミットされていないイベントを書き込みます。ただし、これにより、アグリゲートのイベント ストリームは、同じバージョン番号の異なるイベントが存在する可能性がある状態のままになります。
ある種のレトロスペクティブな解決策を実行できることは知っていますが、それは私が達成しようとしていることではありません。
これは明らかに、イベント ストア データベース側で何らかのロックを行う必要があることを意味します。誰でもこれを行う方法をアドバイスできますか? 回答はデータベース固有である必要はありませんが、イベント ソーシング システムのプロトタイプを作成しようと計画しているため、ravendb の例は素晴らしいでしょう。