sql >> データベース >  >> RDS >> Mysql

EntityFrameworkを使用したAtomicIncrement

    Entity Frameworkでは、これを「アトミック」操作にすることはできません。手順があります:

    1. データベースからエンティティを読み込む
    2. メモリ内のカウンタを変更する
    3. 変更したエンティティをデータベースに保存

    これらの手順の間に、別のクライアントがデータベースからエンティティをロードできますが、それでも古い値が残っています。

    この状況に対処する最善の方法は、楽観的同時実行制御を使用することです。 。これは基本的に、カウンターがステップ1でエンティティをロードしたときと同じでなくなった場合、ステップ3での変更が保存されないことを意味します。代わりに、エンティティをリロードして処理できる例外が発生します。変更を再適用します。

    ワークフローは次のようになります:

    • WorkWordCountのエンティティ プロパティは同時実行トークンとしてマークする必要があります(コードファーストの場合はアノテーションまたはFluent API)
    • データベースからエンティティを読み込む
    • メモリ内のカウンタを変更する
    • SaveChangesを呼び出します try-catchで タイプDbUpdateConcurrencyExceptionの例外をブロックしてキャッチします
    • 例外が発生した場合は、catchでエンティティをリロードします データベースからブロックし、変更を再度適用して、SaveChangesを呼び出します もう一度
    • 例外が発生しなくなるまで、最後の手順を繰り返します

    この回答 この手順のコード例を見つけることができます(DbContextを使用) 。



    1. エラーは何ですかすべての派生テーブルはMySQLで独自のエイリアスを持っている必要がありますか?

    2. SQLServerで文字列内の各単語の最初の文字を大文字にする最良の方法は何ですか

    3. MySQLのキーファイルが正しくありません

    4. SQLServerで複数の行のテキストを単一のテキスト文字列に連結する方法