エンティティ フレームワーク: トランザクション内の SaveChanges()
と SaveChanges(false)
および AcceptAllChanges()
の比較
Entity Framework (EF) では、通常、SaveChanges()
メソッドはトランザクション操作を効果的に処理します。 ただし、SaveChanges(false)
を AcceptAllChanges()
と組み合わせて使用すると、優れた制御性と回復力が得られる状況が存在します。
重要なシナリオの 1 つは、複数の EF コンテキストにわたる分散トランザクションを管理することです。 TransactionScope
を使用する一般的な (ただし欠陥のある) アプローチは次のとおりです。
<code class="language-csharp">using (TransactionScope scope = new TransactionScope()) { // ... context1.SaveChanges(); context2.SaveChanges(); // ... }</code>
context2.SaveChanges()
が失敗すると、トランザクション全体がロールバックされます。 重要なことに、EF は context1
によって加えられた変更を破棄し、障害の分析と回復を妨げます。
より堅牢なソリューションは SaveChanges(false)
と AcceptAllChanges()
を活用します:
<code class="language-csharp">using (TransactionScope scope = new TransactionScope()) { // ... context1.SaveChanges(false); context2.SaveChanges(false); // ... if (scope.Complete()) { context1.AcceptAllChanges(); context2.AcceptAllChanges(); } }</code>
SaveChanges(false)
は、コンテキスト内の変更を破棄せずにデータベース コマンドを送信します。 これにより、失敗した場合の再試行や詳細なログ記録が可能になります。
さらに、ID 列の競合の可能性を考慮してください。 最初の挿入の後、トランザクションが失敗する前に同時挿入を行うと、ID 値が破損する可能性があります。 EF には、これに対する組み込みソリューションがありません。
要約すると、SaveChanges()
は EF のトランザクションのほとんどのニーズに十分対応できますが、SaveChanges(false)
と AcceptAllChanges()
を組み合わせることで、分散トランザクションを処理し、ID 列の競合や、障害の回復。
以上がエンティティフレームワークでSaveChanges()の代わりにSaveChanges(false)とAcceptAllChanges()を使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。