問題タブ [optimistic-locking]
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.
.net - FluentNhibernateOptimistickロックが機能しない
私のアプリケーションでは、2つの異なる会話が同じデータで機能しないようにする戦略を使用するようにアプリケーションを設定しました。しかし、機能していません。理由はわかりません。
問題:
構成:
私のアプリケーションには、FluentNhibernate構成があります。
たとえば、このプロパティを継承するCustomerOrderのインスタンスを保存すると、次のようになります。
マッピングにあります:
よろしく、ティト
java - Query.list()でStaleObjectStateExceptionを防ぐ方法は?
私は自分のソフトウェアでHibernateの楽観的ロックを使用しています(@Versionアノテーションを介して)。これは非常にうまく機能しますが、データベースからいくつかのオブジェクトを取得しようとすると、StaleObjectStateExceptionが発生することがあります。Hibernateがこれらの例外をスローしないようにするにはどうすればよいですか?
c++ - C++ のアトミックと順序付けによる楽観的ロック戦略
c++0x のアトミックについて調べ、非ロック キューと組み合わせて使用した後、それらを試してみることにしました。
アイデアは、楽観的ロックを使用して単一のプロデューサー、複数のコンシューマー キューを作成することでした。メッセージを消費する必要はありません。消費者が最後のバージョンを読んだ場合、またはそれが間違っていたことを知っている限り、スキップはまったく問題ありません。
以下のコードでは、私が念頭に置いていた戦略は失敗します。データが順不同で書き込まれるため、データが破損します。これがなぜなのか、そしてそれを修正する方法についての指針は大歓迎です。
Linux でのコンパイル: g++ -std=c++0x -o コード code.cpp -lpthread
ありがとう、デニス
java - 階層の中間クラスでの Hibernate Versioning の使用
アプリケーションで Hibernate Versioning を使用したいのですが、クラス階層に次のような問題があります: C は B を拡張し、B は A を拡張します。クラス B でバージョンを使用したいのですが、クラス A でバージョンを使用する必要はありませんクラス B でバージョン管理を自動的に使用すると、クラス C で有効になることを知っています。「結合サブクラス」を使用して休止状態で継承を実装し、「バージョン」タグが「結合サブクラス」に対して定義されていません。クラス階層でバージョン管理を使用するにはどうすればよいですか?
nhibernate - NHibernate StaleObjectStateException の後にオブジェクト グラフをどのようにマージするのですか?
マージされたコピーを保存するために StaleObjectStateException がスローされた後、オブジェクトを結合しようとしています。
当社の環境状況は次のとおりです。
- リスト項目
- マルチユーザーシステム
- WPF デスクトップ アプリケーション、SQL Server 2008 データベース
- NHibernate 3.1.0.4000、FluentNHibernate 1.2.0.712
- グローバルで長期にわたる NHibernate セッション [今のところ. プレゼンターごとのセッションが推奨されるパターンであることは理解していますが、現時点ではプロジェクト スケジュールに変換する時間がありません。]
- トップダウン保存とプロパティ ナビゲーション (つまり、トップレベル オブジェクト (ここでは親と呼ばれます) をドメイン グラフに保存します)
- ほとんどの場合、.Cascade.AllDeleteOrphan() が使用されます。
- ユーザーは、ドメイン グラフ内のいくつかのオブジェクトを排他的に所有しますが、親の所有権を共有します。
- Children オブジェクトのナビゲーション プロパティは存在しません。
- すべてのクラスには、数値の ID フィールドと数値のバージョン フィールドがあります。
使用事例:
- ユーザー 1 がアプリケーションを起動し、親を開きます。
- ユーザー 2 がアプリケーションを起動し、親を開きます。
- ユーザー 2 が子 (ここでは C2) を追加します。
- ユーザー 2 が親を保存します。
- ユーザー 1 が子 (ここでは C1) を追加します。
- ユーザー 1 が親を保存します。
- ユーザー 1 は StaleObjectStateException を受け取ります (当然のことです)
例外を適切に処理したいと考えています。ユーザーは親の所有権を共有しているため、ユーザー 1 は正常に保存でき、新しい子とユーザー 2 の子の両方で親を保存できます。
Ayende ( http://msdn.microsoft.com/en-us/magazine/ee819139.aspx )によると、SOSE がスローされると、次のようになります。
NHibernate では、セッションから例外がスローされると、そのセッションが未定義の状態に移行するため、セッションとその読み込まれたエンティティは乾杯します。そのセッションまたは読み込まれたエンティティは使用できなくなります
C1 には、現在では役に立たないセッションによって ID とバージョン番号が既に割り当てられています。(そうでなかったらよかったのに。)
ISession.Merge() と ISession.Refresh() の使用を組み合わせて、 C1 と C2 の両方を持つ新しく保存された Parent を取得するにはどうすればよいでしょうか?
私たちは多くの難解な順列を試しましたが、どれも完全には機能しませんでした。通常、「行が別のトランザクションによって更新または削除された (または保存されていない値のマッピングが正しくなかった)」か、ODBC レベルでの実際の ID の衝突のいずれかです。
現時点での私たちの理論:
- C1 のバージョン番号をリセットします (「保存されていない値のマッピングが正しくない」ことを防ぐため)
- 新しいセッションを取得する
- newSession.Refresh(C1);
- newParent = newSession.QueryOver[...]
- newParent.Add(C1);
- newSession.SaveOrUpdate(newParent)
ただし、すべてのドキュメントは、newSession.Merge で十分であることを示唆しています。
研究として使用されるその他の投稿:
流暢な NHibernate 初心者: 別のトランザクションによって行が更新または削除され
た
StaleObjectstateException 行は、
変更されたプロパティのみを保存するように NHibernate に指示する方法
によって更新または削除されました
。
mongodb - MongoDBドキュメント操作はアトミックで分離されていますが、一貫性がありますか?
アプリケーションをAppEngineデータストアからMongoDBバックエンドに移植している最中であり、「ドキュメントの更新」の一貫性について質問があります。1つのドキュメントの更新がすべてアトミックで分離されていることは理解していますが、異なるレプリカセット間で「一貫性がある」ことを保証する方法はありますか?
私たちのアプリケーションでは、多くのユーザーが1回の更新中にいくつかの埋め込みドキュメント(オブジェクト)を挿入することで、1つのドキュメントを同時に更新しようとする可能性があります。これらの更新がすべてのレプリカで論理的に一貫した方法で行われるようにする必要があります。つまり、1人のユーザーがいくつかの埋め込みドキュメントを親ドキュメントに「配置」すると、他のユーザーは、確実に完了するまで、埋め込みドキュメントを親ドキュメントに配置できなくなります。最初のユーザーの更新を読んで受け取りました。
つまり、一貫性とは、2人のユーザーが1つのドキュメントに対してまったく同時に更新を実行しようとした場合に、MongoDBがそれらの更新の一方のみを許可し、もう一方を破棄する(または少なくとも両方が発生するのを防ぎます)。ここでは、標準の「シャーディング」ソリューションを使用できません。これは、単一の更新が単なるインクリメントまたはデクリメント以上のもので構成されているためです。
1つの特定のドキュメントの一貫性を保証する最良の方法は何ですか?
java - JPA: @JoinColumn(updatable = false) を設定して OptimisticLockException を回避する
次の 2 つのエンティティがあるとします。
2 つの質問:
エンティティ B が DB にマージされるたびにエンティティ A のバージョン番号が増加するか (A との関係で CascadeType.MERGE が定義されていないことに注意してください)、したがって、A が別のエンティティとマージされると OptimisticcLockException が発生する可能性があります。バージョンナンバー?
はいの場合
@JoinColumn(updatable=false)
、関係を追加すると OptimisticLockException の可能性を回避するのに役立ちますか?
私の状況では、エンティティ B は非常に頻繁に更新され、A は散発的に更新されますが、その基本的な属性 (関係ではない) のみが更新され、エンティティ A で OptimisticLockException が発生します。
grails - Grailsパフォーマンステストエラー:org.hibernate.StaleObjectStateException:行が別のトランザクションによって更新または削除されました
パフォーマンステストの準備をしていて、新しいテストケースを作成しています。したがって、1つのテストケースをテストし、アクセスできるサーバーで実行すると、次のようになります。org.hibernate.StaleObjectStateException:行が別のトランザクションによって更新または削除されました
テストしたいアプリケーションはバックエンドです。ビューもセッションもありません。RESTのようなものです[すべてのリクエストには、タスクを実行するために必要なすべてのものが含まれています]。私は1人のユーザーに対して1つのAPIを何度もテストしていました。リクエストが届き、サービスが機能し、レスポンスが返送されます。レスポンスを分析して、同じユーザーの同じAPIに別のリクエストを送信します。
前述したように、オブジェクトはセッションに保存されません。リクエストが来るたびに、User.get(id from params)を実行しています。
現在、Postgres8.4.4でこのアプリを実行しています。サーバーは非常に強力で、現在はまったく負荷がありません。
アプリ[サーバーはリモート]から応答を受信し、分析して、トランザクションが保存される前に別のリクエストを送り返すことができるように思えます。これはかなり奇妙です。
ここで足りないものはありますか?私はそれについて何をすべきですか?
hibernate - Grailsドメインクラスでバージョン番号を使用しない場合はどうなりますか?
以前のGrailsプロジェクト(トランザクション量が多い)では、1対多、多対多の関係を持つStaleObjectExceptionsで恐ろしい経験をしました。
私は基本的にFacebookの友達のプロフィール(School、Employersのプロフィール全体)を保持していて、ほとんどの場合、1000人のユーザープロフィールを一緒に保存していました。そのデータはほとんど修正されており、経験や教育を保存するたびにバージョンを増やす必要がなかったため、School and Employerドメインクラスからバージョン番号を削除することで、ほとんどの問題を解決しました。スケジュールが厳しいため、私は物事を機能させる必要があり、古いオブジェクトの例外をまだ取得していたため、ユーザーオブジェクト階層全体からバージョン番号を削除しました。
それで、ドメインクラスでバージョンを使用しないとき、私はまだ暗闇にいますか?
ravendb - ConfigでRavenDBUseOptimisticConcurrency?
Raven.Server.exe.configで楽観的同時実行性をtrueに設定する方法はありますか?または、データベースレベルで何らかの形で適用できますか?RavenDBのサイトで、UseOptimisticConcurrency = trueの設定についていくつか言及されていますが、コード内のセッションレベルにあるように見えます。
その設定がサーバー全体のどこかに存在するかどうかを知りたいので、コードでセッションごとに指定する必要はありません。
編集:上記のコードは次のエラーを生成します。理由を見つけようとしています...
編集2:わかりました、私は進歩しています。オブジェクトを取得し、すべて同じセッション内でGetEtagFor()を呼び出すと、有効なeTagが取得されます。ですから、私の主な質問は次のとおりです。クライアントUI内でセッションを使用して、アプリの起動時にセッションを1回開き、最後に閉じる方法は正しいですか。そして...eTagを保存する正しい方法は何ですか?上でコーディングした方法では、eTagは保存する直前に取得されますが、これは間違った方法だと思います。オブジェクトが最初に取得されたときにeTagを取得する必要があると思います。しかし、最初にオブジェクトのリストを取得するとき、それぞれをループして、それらに対してGetEtagFor()を呼び出す必要がありますか?正しくないようです...