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 つのヒント

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

推薦する

嵐が来ている: クラウド大手を阻止するために、一部のオープンソースソフトウェア企業はオープンソースライセンスを制限し始めている

オープンソースソフトウェアの世界では、スタートアップ企業とクラウドコンピューティングの大手企業の間で...

Weiboマーケティングを行う際に考慮すべきこと

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス最近、私は会社のWeib...

仮想化、ブレード、省エネがデータセンターの3つの障害を克服

HP エンタープライズ コンピューティングおよびプロフェッショナル サービス グループのアジア太平洋...

外部リンク作成の経験5年。ウェブサイトを公開するには?外部リンクを作成するには?

私は最適化業界で 5 年間働いてきましたが、それは非常に困難な道のりでした。 5年前の今頃、SEO ...

推奨: tmzvps、高品質の VPS 販売業者、明らかなネットワーク最適化、優れたアフターサービス

海外で非常に評判の良いtmzvpsを紹介します。価格が比較的高いため、多くの中国人はそれに触れたこと...

QQ Space は Baidu のキーワードをランク​​付けするために使用できますか?

私たちのグループの友人が、QQ Spaceがキーワードランキングに参加できるかどうか尋ねてきましたが...

別の視点から考えてみましょう。もし私がBaiduの検索エンジンだったら

検索エンジンの観点から見ると、ウェブサイトの最適化は簡単だという記事も見かけますが、私はそうは思いま...

アメリカ西海岸サンタクララのVPSをレビュー。不人気商人カマテラが経営。

約 1 週間前、香港で 1Gbps 帯域幅の Kamatera の VPS をテストしました。価格が...

ウェブサイトの最適化: ウェブサイトが含まれていないのはなぜですか?

ウェブサイトの最適化プロセスにおけるインクルージョンは、初心者にとってもベテランにとっても常に非常に...

長年にわたり私たちを騙してきた「友達リンク」の詳細な説明

これは、インターネットが今とても混沌としているため、最近私が感じたことです。多くのウェブマスターは、...

SSDVPS-512M メモリ (第 2 世代 VZ) + 20GSSD/月額 3.5 USD/QuadraNet

ssdvps.com は 2009 年に登録されたドメイン名です。公式ウェブサイトには関連情報があり...

企業はインターネットマーケティング業務の KPI 評価を策定すべきでしょうか?

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

APPプロモーション:これらのデータとチャネルをマスターすることによってのみ、100万人のユーザーを獲得できます。

大企業でも中小企業でも、アプリをゼロから宣伝するには、起業プロセスを経る必要があります。常に、人員が...

Bespin Globalがクラウド管理サービスで「Excellence Level」認定を取得し、中国のMSP業界をリードし続けている

2020年1月7日、北京—中国情報通信研究院(CAICT)主催の「2020年クラウド管理およびクラウ...

真実は、SEO は存在しないということです。

コアヒント: SEO は本当に検索エンジンの最適化だけでしょうか? では、検索の対象となるのは誰でし...