EF Core トランザクション コミットと分散トランザクションの詳細な分析

EF Core トランザクション コミットと分散トランザクションの詳細な分析

  [[388003]]

この記事はWeChatの公開アカウント「Backend Q」から転載したもので、著者はconanです。この記事を転載する場合は、Backend Q の公開アカウントにご連絡ください。

制御トランザクション

DbContext.Database API を使用して、トランザクションを開始、コミット、およびロールバックできます。次の例は、単一のトランザクションで実行される 2 つの SaveChanges 操作と LINQ クエリを示しています。

  1. var context = new BloggingContext(); を使用します。
  2. var transaction = context を使用します。データベース.BeginTransaction();
  3.  
  4. 試す
  5. {
  6. コンテキスト。ブログ。 (新しいブログ { Url = "http://blogs.msdn.com/dotnet" }を追加します);
  7. コンテキスト.SaveChanges();
  8.  
  9. コンテキスト。ブログ。 (新しいブログ { Url = "http://blogs.msdn.com/visualstudio" }を追加します);
  10. コンテキスト.SaveChanges();
  11.  
  12. var blogs = context.Blogs
  13. .OrderBy(b => b.Url)
  14. .ToList();
  15.  
  16. //専念 トランザクションすべてのコマンドが成功した場合トランザクションは自動的にロールバックされます 
  17. //どちらかのコマンドが失敗した場合破棄される
  18. トランザクションをコミットます
  19. }
  20. キャッチ(例外)
  21. {
  22. // TODO: 失敗を処理する
  23. }

すべてのリレーショナル データベース プロバイダーはトランザクションをサポートしていますが、他のプロバイダー タイプでは、トランザクション API が呼び出されたときに例外がスローされたり、何も実行されなかったりする場合があります。

System.Transactions の使用

より広い範囲にわたって調整する必要がある場合は、アンビエント トランザクションを使用できます。

  1. (var scope = new TransactionScope( を使用)
  2. TransactionScopeOption.必須、
  3. 新しい TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
  4. {
  5. var connection = new SqlConnection(connectionString); を使用します。
  6. 接続.Open ( ) ;
  7.  
  8. 試す
  9. {
  10. //トランザクション内でADO.NET コマンドを実行する 
  11. var コマンド =接続.CreateCommand();
  12. command.CommandText = "dbo.Blogs から削除" ;
  13. コマンドを実行します。
  14.  
  15. //トランザクション内でEF Coreコマンド実行する 
  16. var options = new DbContextOptionsBuilder<BloggingContext>()
  17. .UseSqlServer(接続)
  18. .オプション;
  19.  
  20. (var context = new BloggingContext(options)) を使用します
  21. {
  22. コンテキスト。ブログ。 (新しいブログ { Url = "http://blogs.msdn.com/dotnet" }を追加します);
  23. コンテキスト.SaveChanges();
  24. }
  25.  
  26. //専念 トランザクションすべてのコマンドが成功した場合トランザクションは自動的にロールバックされます 
  27. //どちらかのコマンドが失敗した場合破棄される
  28. スコープを完了します。
  29. }
  30. キャッチ(例外)
  31. {
  32. // TODO: 失敗を処理する
  33. }
  34. }

明示的なトランザクションに参加することも可能です。

  1. (var transaction = new CommittableTransaction( を使用)
  2. 新しい TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
  3. {
  4. var接続= 新しい SqlConnection(接続文字列);
  5.  
  6. 試す
  7. {
  8. var options = new DbContextOptionsBuilder<BloggingContext>()
  9. .UseSqlServer(接続)
  10. .オプション;
  11.  
  12. (var context = new BloggingContext(options)) を使用します
  13. {
  14. コンテクスト。データベース.OpenConnection();
  15. コンテクスト。データベース.EnlistTransaction(トランザクション);
  16.  
  17. //トランザクション内でADO.NET コマンドを実行する 
  18. var コマンド =接続.CreateCommand();
  19. command.CommandText = "dbo.Blogs から削除" ;
  20. コマンドを実行します。
  21.  
  22. //トランザクション内でEF Coreコマンド実行する 
  23. コンテキスト。ブログ。 (新しいブログ { Url = "http://blogs.msdn.com/dotnet" }を追加します);
  24. コンテキスト.SaveChanges();
  25. コンテクスト。データベース.CloseConnection();
  26. }
  27.  
  28. //専念 トランザクションすべてのコマンドが成功した場合トランザクションは自動的にロールバックされます 
  29. //どちらかのコマンドが失敗した場合破棄される
  30. トランザクションをコミットます
  31. }
  32. キャッチ(例外)
  33. {
  34. // TODO: 失敗を処理する
  35. }
  36. }

System.Transactions の制限

  1. EF Core は、System.Transactions のサポートを実装するためにデータベース プロバイダーに依存しています。プロバイダーが System.Transactions のサポートを実装していない場合、これらの API への呼び出しは完全に無視される可能性があります。 SqlClient はこれをサポートしています。
  2. .NET Core 2.1 以降、System.Transactions 実装には分散トランザクションのサポートが含まれていないため、TransactionScope または CommittableTransaction を使用して複数のリソース マネージャー間でトランザクションを調整することはできません。

<<:  クラウド コンピューティングの複雑さの中での可観測性を成功させるための 5 つのヒント

>>:  エッジコンピューティングによるオフィス環境の多様化

推薦する

大手企業間の競争を背景に、国内パブリッククラウド市場が急成長

近年、5G、人工知能、デジタルツインなどの技術の継続的な発展により、モノのインターネットの潮流がさら...

IDC: パブリック クラウドは 2017 年上半期に 28.6% 成長しました。パブリック クラウドがなければ、イノベーションは起こりません。

IDC の世界半期パブリック クラウド サービス追跡レポートの最新結果によると、世界のパブリック ク...

「クラウド医療」の健全な青写真

デジタル社会は不可逆的な流れであり、ヘルスケアはその重要な部分を占めています。今日のヘルスケア業界で...

外国貿易B2Bプラットフォームで製品を宣伝するにはどうすればよいですか?

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています今日は、外...

SEO は速くて良いものです。速い SEO と良い SEO のどちらか一方を達成することは不可能です。どちらを望みますか?

昨日(6月13日)の午後、友人がQQのURLを送ってきて、なぜこのウェブサイトが上位にランクされてい...

vpsao - ロサンゼルス VPS 年間支払いはわずか 5 ドル、WeChat と Alipay の支払いをサポート

最近、新しい業者であるvpsaoから2通のメールを受け取りました(これまでvpsaoに注目したことは...

香港のVPSをレンタル: 最速の香港VPSを推奨

香港の VPS をレンタルする場合、最適な選択肢はどれですか?最も速い香港の VPS はどれですか?...

クラウド コンピューティング、フォグ コンピューティング、エッジ コンピューティングのコンピューティング センターはどこにありますか?

[51CTO.com からのオリジナル記事] 今日のインターネットの発展における最も注目すべき特徴は...

テンプレートサイト間で友好的なリンクを交換するための3つの迅速で効果的な方法

現在、オープンソースのウェブサイト構築プログラムは、ウェブマスターの間で最も一般的です。多くのウェブ...

分散ネットワーク全体の内部脅威を表示して対処する

ハッカー、サイバー犯罪者、マルウェア感染、その他の外部からの脅威がニュースの見出しを賑わせています。...

オレンジクラウドが2021年CIFTISに初登場、中国工業企業の発展に新たな活力を注入

9月2日、「デジタルが未来を切り開き、サービスが発展を促進する」をテーマにした2021年中国国際サー...

中国のレンタカーウェブサイトのトラフィックシェアによるトップ10ランキング

ヒットワイズは3月4日、公式Weiboアカウントを通じて、中国レンタカーサイトのトラフィックシェア上...

エッジコンピューティングとモノのインターネット: 成長の機会

データ量は爆発的に増加しており、2025年までに世界では毎日463EBのデータが生成されると推定され...

「ダブル12イベント」キーワードランキング/順位ASOソース、低価格ソース!

Apple App Store キーワードランキング リストの最適化は常に激動の時代です。リスト内の...

WeChatマーケティング体験:WeChatモーメントの冬越しにご注意

10日前、「Win in China」の決勝戦を観ました。今でも一番鮮明に覚えているのは、ジャック・...