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

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

推薦する

「どのVPSが優れているか」についてみんなでチャットしましょう。

どの VPS が優れていますか?どのブランドの VPS が良いですか?どの VPS の方が安いですか...

camohosting 無料 250M 仮想ホスト

250MB のハード ドライブ、月間トラフィック 10G、Web サイト 1 つ、MySQL 5 つ...

ウェブマスターネットワークニュース:タオバオクラウンストアのオーナーがアルパカ飼育に転職し、パフォーマンスで1日数万元を稼ぐ

1. 羅永浩氏との独占インタビュー: 敗者は去ってエリートに仕えるべきだ。私たちは次の Apple ...

OpenStack プロジェクト: VMware の貢献が最も大きかったのはどれですか?

VMware Integrated OpenStack は VMware のポートフォリオの中で最も...

事例分析:ブラックリストに登録されたウェブサイトの分析プロセス

ウェブマスターツール tool.chinaz.com の「ウェブサイトハッキング検出」でウェブサイト...

[更新/有効性保証] 年間15ドル(約100元)以下の安価な海外VPSのおすすめ

今日は安価な海外VPS、特にローエンドと低価格シリーズのVPSについてお話ししましょう。市場の変化、...

UCloudのXu Liang氏との独占インタビュー:UCloudの仮想ネットワークの進化

[51CTO.com からのオリジナル記事] 今日、ほぼすべての IT インフラストラクチャがクラウ...

Baidu外部リンクツールの使用経験 リンク名

Baidu の外部リンク ツールはリリースされてからしばらく経っており、多くのウェブマスターが使用し...

フォレスターは2022年がエッジ、IoT、ネットワーク技術が融合する年になると予測

[[435095]] Forrester は、これらの業界における「具体的かつ目に見える変化」に基づ...

bluevm-1g メモリ KVM 月額支払い $5.99

256M のメモリを搭載した KVM を年間 25 ドルで販売するのは魅力的ではないでしょうか?これ...

第一回美団クラウド人工知能サミットが開幕、エコパートナーと協力して最もオープンなAIプラットフォームを構築

10月31日、中関村サイエンスパーク管理委員会の指導の下、美団クラウドが主催し、「AIの力で共存とW...

外国貿易SEO最適化の細部は、ウェブサイトのキーワードランキングを向上させる

現在の経済グローバル化の時代では、世界の金融が徐々に融合して一体化しており、国内外の貿易交流がますま...

音楽レビューからブランドビデオまで、NetEase Cloud Music のマーケティングの秘密は何でしょうか?

広告業界には「NetEase は広告会社である」という専門用語があります。そう言う理由は、NetEa...

クラウド移行のための 5R 方式のベスト プラクティスの概要

翻訳者 |チェン・ジュン企画 |趙雲近年、クラウド移行という言葉は、ほとんどの企業の IT に関する...