前提
VS2022、c#、EF6、Azure SQL Serverでよくあるデータベース情報の取得・更新の実装をしています。
(Visual Studio 2022、c#.NET MVC5 アプリを.NET Framework 4.7.2、Entity Framework 6を利用して開発予定(変更の可能性あり)です。)
実現したいこと
更新時のトランザクションやリトライ処理・エラー発生時のcatchについて正しい実装を知りたい。
発生している問題・エラーメッセージ
特になし
該当のソースコード
C#
1●リトライ設定 2SetExecutionStrategy( 3"System.Data.SqlClient", 4() => new SqlAzureExecutionStrategy(10, TimeSpan.FromSeconds(30))); 5 6 7●更新処理 8var executionStrategy = new SqlAzureExecutionStrategy(); 9 10executionStrategy.Execute( 11 () => 12 { 13 using (var db = new BooksDbContext()) 14 { 15 try 16 { 17 using (var tran = db.Database.BeginTransaction()) 18 { 19 try 20 { 21 db.Books.Add(new Book { Title = "日本の歴史1", HakkoYear = 2019 }); 22 db.Books.Add(new Book { Title = "日本の歴史2", HakkoYear = 2020 }); 23 db.SaveChanges(); ←① 24 25 db.Database.ExecuteSqlCommand( 26 "UPDATE Book SET Title = '日本の歴史1_1' WHERE Id = 1" ←② 27 ); 28 29 db.Books.Add(new Book { Title = "日本の歴史3", PublishedYear = 2022 }); 30 31 db.SaveChanges(); ←③ 32 33 tran.Commit(); 34 } 35 catch (SqlException e) ← [A]SQLに誤りがあった場合等のエラー 36 { 37 Console.WriteLine("SqlException1" + e.ToString()); 38 } 39 } 40 } 41 catch (SqlException e) ← [B]Azureへの接続自体ののエラー(権限なし等) 42 { 43 Console.WriteLine("SqlException2" + e.ToString()); 44 } 45 } 46 });
試したこと
Azureはリトライ処理が必須とのことで一通り実装しましたが、
トランザクションとリトライとキャッチ処理がバラバラのサンプルを合わせました。
(1)例中の①②③の3回の更新処理でもし一時的なエラーが発生した場合はリトライ設定どおりのリトライを実行してほしい
(2)SQLエラーや致命的な接続でエラーの場合はcatchしてしかるべき処理をして終了させたい
というのが希望の動作です。
それと、このコードで一時エラーの場合のリトライ処理が本当に実行されているか確認する方法が分からないです。
一時的なエラーを故意に作り出すことも難しいような、、。
実装方法や確認方法についてご教授いただけますと幸いです。
補足情報(FW/ツールのバージョンなど)
回答2件