問題タブ [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.
jpa - JPA-@Version-読み取り時に増加
@versionアノテーションを付けた単純なエンティティejbを実装しました。エンティティを更新するたびにバージョン番号が増えると思います。
しかし、これは期待どおりに機能しないようです。また、エンティティを読み取るたびに、バージョン番号が自動的に増加します(!?)。バージョンはコミット後にのみ増加すると思いますか?
読み取りでもバージョンが増える理由を誰かが説明できますか?
entity-framework - Entity Framework、PostgreSQL、非表示のxmin列を使用した楽観的同時実行性
私はPostgreSQL9.1データベースに対してEntityFramework(モデルファーストアプローチ)を使用しています。
おそらく、すべてのテーブルにxminという非表示の列があり、更新を実行する前にEFが行が変更されたかどうかを判断するために使用することをご存知でしょう。
PostgreSQLの内部が変更される可能性があり、これは本番コードではまったく良い考えではないかもしれないことを私は知っていますが、試してみたいと思います。
モデルを手動で更新して1つのテーブルにこの列を含め、その動作をテストするために必要な手順は何ですか?
TIA。
編集1:これまでのところ、自己追跡エンティティでモデルファーストアプローチを使用しています。
モデルは次のように変更されました:
xmin列はSELECTで効果的に取得され、UPDATE中に使用されます。
ここでの問題は、xmin列で使用されるキャストにあります。失敗します。私がこれまでに見つけたのは、キャストがまったくなくても機能するということです。しかし、この列のクエリでキャストをまったく使用しないようにEFに指示する方法がわかりません。
ところで、xmin列のデータ型は「xid」であり、NpgsqlADO.NETプロバイダーには不明です。
編集2:これはSQLテキストを生成するプロバイダーです。プロバイダーコードを調べた後、整数データ型を使用する場合、キャストがないことを確認できます。そのため、エンティティで整数を使用して値を格納し、エンティティを選択して更新しようとしました。同時実行例外で失敗します。
pgsqlログは次のとおりです。
うーん、影響を受けた行の取得に問題がある可能性があります。同じクエリを手動で実行すると、1つの行が更新されるためです...
編集3:npgsqlデバッグログを有効にしました。xminが変更されていない場合、次のようになります(UPDATE 1):
それが変更されたとき、私は次のようになります(UPDATE 0):
しかし、残念ながら、どちらの場合もOptimisticConcurrencyExceptionが発生します...
編集4:npgsqlログを確認した後、エンティティFrameworkは内部でDbCommand.ExecuteReader(CommandBehavior.SequentialAccess)とそれに続くreader.Read()を使用して、UPDATEステートメントの影響を受けた行数を判別しているようです。
私は間違っているかもしれませんが、問題の原因である可能性があるForwardsOnlyDataReader.Read()中にプロバイダーがfalseを返しています。
編集5:これは間違いなくプロバイダーの問題です(バージョン2.0.11.93および今後のバージョン2.0.11.94)。
INSERTステートメントの場合、プロバイダーは、基になるデータ型がSERIAL(int)またはBIGSERIAL(bigint)の場合にのみ計算列をサポートします。
UPDATEステートメントの場合、プロバイダーは特定のDbUpdateCommandTreeのReturningプロパティを処理しません。これは、計算列が返されないことを意味します。SaveChanges()を呼び出した後、エンティティオブジェクトを手動で更新する必要があります。楽観的並行性はこれまでサポートされていません。
プロバイダーに最小限のサポートを実装し、投稿を続けます。
編集6:Returningプロパティは、私自身のバージョンのプロバイダーで処理されるようになりました。コードを共有させていただきます。お気軽にお問い合わせください。
sql-server - updateステートメントで最新のrowversion/timestamp値を取得する - Sql Server
オプティミスティック コンカレンシーを処理するために rowversion 列を使用しており、更新を行ったときに新しい rowversion 値を取得して、データ レイヤーに最新の値が含まれるようにし、コンカレンシー例外を取得して別の更新を実行できるようにしたいと考えています (レコードが他の人によって更新されています)。
更新を行った後、データレイヤーで取得を行っていましたが、これはあまり効率的ではなく、完全に信頼できるものでもありませんでした。
次の表の場合:
私は試した:
しかし、他の誰かの更新から rowverion の値を取得できない可能性があるため、完全には満足していませんでした。次に、rowversion のドキュメント (http://msdn.microsoft.com/en-us/library/ms182776.aspx / http://msdn.microsoft.com/en-us/library/ms177564.aspx ) で OUTPUT ステートメントに出くわしました。 )そしてこれを試しました:
これはうまくいきます。私の非常に基本的なテスト (10000 回の呼び出しを実行してタイミングを取るだけ) では、OUTPUT オプションは約 40% 長くかかりますが、それでも 0.5 ミリ秒未満です。どちらもSET STATISTICS TIME ONで測定可能な時間はかかりませんでした.
私の質問は、これを行うためのより良い/より簡単な方法を知っている人はいますか?
ID 列に SCOPE_IDENTITY() に似た関数を使用できることを期待していましたが、そのようなものは見つかりませんでした。私が何かを見逃しているかどうか誰にも分かりますか?
前もって感謝します。
entity-framework - EntityFrameworkはupdateステートメントの影響を受ける行をどのように検出しますか
Npgsqlプロバイダー(VS2010-.NET 4ターゲット)でエンティティフレームワーク、モデルファースト、自己追跡エンティティを使用しています。
楽観的同時実行性の例外を追跡しようとしていますが、問題はOptimisticConcurrencyException
、影響を受ける行が0より大きい場合でも、エンティティの列が固定としてマークされるとすぐにanが発生することです。
ここでいくつか掘り下げた後、コマンドテキストが単純な更新ステートメントである場合の代わりに、Entity Frameworkが更新コマンドを発行し、dbCommand.ExecuteReader(CommandBehavior.SequentialAccess)
その後に続く理由を知りたいですか?dbDataReader.Read()
dbCommand.ExecuteNonQuery()
ありがとう。
jdbc - オプティミスティック コンカレンシーの DB サポート
古典的なシナリオがあります: このレコードからの以前に準備された値に基づく同じレコードへの 2 つの更新。私は楽観的並行性を前提として作業しています。条件付き更新を自分で実装するのは難しくありません。問題は、それを処理するドライバーまたは DB の特定の API に依存できるかどうかです。
当然、私はそれをグーグルで検索しましたが、コードサンプルについて言及せずに、楽観的同時実行とは何かの説明しか思い浮かばないようです...
JDBC データダイレクトドライバーを使用しています。
ありがとう!
entity-framework-4 - Entity FrameworkでのConflictMode.ContinueOnConflict実装の欠如を克服するためのパターン?
Linq To SQLDataContext
にはオーバーロードがあり、オプティミスティック同時実行例外がスローされたときに更新を続行できるようにし、開発者に単一のTryCatchブロックSubmitChanges
で後で競合を解決するメカニズムを提供します。
にWCFDataServicesContext
は、少なくともエラーが発生したときに更新を続行し、競合する更新を未解決のままにして、後で調べることができるようにするメソッドのSaveChangedOptions.ContinueOnError
パラメーター があります。SaveChanges
(1)では、なぜそのObjectContext.SaveChanges
方法にそのようなオプションがないのですか?
(2)Linq To SQLの動作を模倣する更新パターンはありますか?私がMSDNで見つけた例では、複数の更新が行われた場合に、単一のTryCatchブロックでホームが表示されるように見えます。ただし、このパターンでは、競合する各更新を個別に調査することはできません。最初の競合について警告し、「1回のスイープでテーブルをクリーンアップ」して、楽観的同時実行性の例外が発生しないようにするオプションを提供します。存在するかどうか、そしてそれらについて何をしたいのかを知ること。
asp.net - DevexpressASPXGridViewおよびEntityFramework4.3.1での同時実行例外
私の問題
並行性をテストするための単純なWebFormsプロジェクトがあります。
使ってます:
現在、同時実行性チェックに問題があります。
データを編集しているのは私だけですが、DevExpress ASPXGridViewを使用して同じレコードを2回編集すると、同時実行例外が発生します。
私が得る例外は次のとおりです:System.Data.OptimisticConcurrencyException
私のセットアップ
**簡潔にするためにここでは簡略化しています
私のコードの最初のエンティティは次のように定義されています:
[ConcurrencyCheck]属性を設定したために、concurrecnyチェックがテストされているLastUpdateという単一のフィールドを追加したことがわかります。
DevExpress ASPXGridViewを使用するWebページでは、EntityDataSourceを使用して、グリッドビューとエンティティフレームワークの間のバインディングを作成しています。グリッドビューはポップアップエディタを使用しています。私は次のイベントをフックしています:
また、直接一致テストをテストするためにいくつかのボタンイベントをフックしています。
例えば
例えば
これらのボタンは期待どおりに機能します。グリッドの更新のみに問題があるようです。
グリッドがObjectContectを使用する必要があり、エンティティフレームワーククラスがDBContextを使用していることが原因である可能性がありますか?
私が試みた修正
私は解決策を見つけようとしてインターネットを精査しました。DevExpressフォーラムをチェックし、StackOverflowの他の投稿、インターネット上のさまざまな投稿、並行性に関するMicrosoft MSDNの記事をチェックしましたが、これを解決することはできません。
私の投稿ほど「シンプル」な投稿はありませんでした。それらはすべて他のデータが関係していた。例:マスター/詳細の関係。カスタムエディタ。など。すべてのinbuildDevExpressコントロールを使用しており、dbテーブル/エンティティに単一のグリッドビューを表示するだけです。
一部の投稿では、エンティティを更新することを提案しています。これを試しましたが、エンティティがオブジェクト状態マネージャーで追跡されていないという例外が発生します。
オブジェクトコンテキスト/データベースコンテキストを破棄して再作成することでエンティティフレームワークを更新しようとしましたが、どういうわけか、並行性の問題が発生します。
DBContexctとObjectContextを使用して更新してみました。どちらも機能しませんでした。(objContext.Refresh(RefreshMode.StoreWins、entity)。前述のように例外が発生します]エンティティが追跡されていないと言った場合、または変更されていないエンティティのみを更新するように指示した場合、何も起こりません(更新なし、例外)
DBContextをグローバルにしようとしましたが、WebFormsは、Webを更新するたびに、状態全体を再作成し、グリッドデータコンテキストなどを再フックしたいと考えているため、これは適切ではありません。(ページの読み込み、ユーザーのクリックによる編集、ユーザーのクリックによる更新)
現在、これらのソリューションはすべて、並行性の例外の後に何をすべきかを悩ませているようです。そもそも例外を取得するべきではないことを考えると、彼らは役に立たないと思います。
提案
これを機能させる方法について何か提案はありますか?
グリッドからデータを投稿した後、エンティティフレームワークを手動で更新する必要がありますか?(私は今これだけを考えました)
それは私が持っている非常に簡単なセットアップのようです。多分私は非常に明白な何かを逃しています。私はまだWebFormsやEntityFrameworkを使ったことがないので、私が見逃している単純な(そしておそらく明白な)解決策があるかもしれませんか?
助けていただければ幸いです。
ありがとうピーターメイズ
.net - タイムスタンプを無視するEntity Frameworkエンティティの更新
楽観的並行性チェックを実装しようとしています。私は一般的なリポジトリと作業単位のパターンを利用しています。
タイムスタンプ属性のプロパティ (バイト配列として) をエンティティに導入しました。これにより、データを更新するたびに値が自動的に増加します (データベースで管理されているようですが、これが本来の目的です)。
(オートマッパーを使用して) VM を実際のモデルにマッピングすることにより、ビュー モデルから更新された値を読み込みます。これにより、適切なタイプのエンティティの新しい (切り離された?) インスタンスが生成され、対応するすべてのフィールドが設定されます (タイムスタンプを含む)。
更新自体は次のように実行されます
i_oEntity は自動マッピングされたエンティティです。
これにより、値自体は正常に更新されますが、ビューモデルからのタイムスタンプ値は完全に無視されます。結果の SQL コードでは、WHERE 句で最新の rowversion 値が使用されます。
要するに: EF の WHERE 句で使用されるビューモデルのタイムスタンプ値を取得するにはどうすればよいですか?
c# - EF 5.0コードファーストを使用して同時実行チェックを有効にするにはどうすればよいですか?
アトミック操作でチェックしてから更新したいと思います。トランザクションを管理するためにdbcontextを使用しています。レコードが別のスレッドによって変更された場合に例外が発生することを期待していましたが、例外はスローされません。どんな助けでもいただければ幸いです。これが私の出力です:
これが私のコードスニペットです: