[[388003]]この記事はWeChatの公開アカウント「Backend Q」から転載したもので、著者はconanです。この記事を転載する場合は、Backend Q の公開アカウントにご連絡ください。 制御トランザクションDbContext.Database API を使用して、トランザクションを開始、コミット、およびロールバックできます。次の例は、単一のトランザクションで実行される 2 つの SaveChanges 操作と LINQ クエリを示しています。 - var context = new BloggingContext(); を使用します。
- var transaction = context を使用します。データベース.BeginTransaction();
-
- 試す
- {
- コンテキスト。ブログ。 (新しいブログ { Url = "http://blogs.msdn.com/dotnet" }を追加します);
- コンテキスト.SaveChanges();
-
- コンテキスト。ブログ。 (新しいブログ { Url = "http://blogs.msdn.com/visualstudio" }を追加します);
- コンテキスト.SaveChanges();
-
- var blogs = context.Blogs
- .OrderBy(b => b.Url)
- .ToList();
-
- //専念 トランザクションすべてのコマンドが成功した場合、トランザクションは自動的にロールバックされます
- //どちらかのコマンドが失敗した場合に破棄される
- トランザクションをコミットします。
- }
- キャッチ(例外)
- {
- // TODO: 失敗を処理する
- }
すべてのリレーショナル データベース プロバイダーはトランザクションをサポートしていますが、他のプロバイダー タイプでは、トランザクション API が呼び出されたときに例外がスローされたり、何も実行されなかったりする場合があります。 System.Transactions の使用より広い範囲にわたって調整する必要がある場合は、アンビエント トランザクションを使用できます。 - (var scope = new TransactionScope( を使用)
- TransactionScopeOption.必須、
- 新しい TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
- {
- var connection = new SqlConnection(connectionString); を使用します。
- 接続.Open ( ) ;
-
- 試す
- {
- //トランザクション内で生のADO.NET コマンドを実行する
- var コマンド =接続.CreateCommand();
- command.CommandText = "dbo.Blogs から削除" ;
- コマンドを実行します。
-
- //トランザクション内でEF Coreコマンドを実行する
- var options = new DbContextOptionsBuilder<BloggingContext>()
- .UseSqlServer(接続)
- .オプション;
-
- (var context = new BloggingContext(options)) を使用します
- {
- コンテキスト。ブログ。 (新しいブログ { Url = "http://blogs.msdn.com/dotnet" }を追加します);
- コンテキスト.SaveChanges();
- }
-
- //専念 トランザクションすべてのコマンドが成功した場合、トランザクションは自動的にロールバックされます
- //どちらかのコマンドが失敗した場合に破棄される
- スコープを完了します。
- }
- キャッチ(例外)
- {
- // TODO: 失敗を処理する
- }
- }
明示的なトランザクションに参加することも可能です。 - (var transaction = new CommittableTransaction( を使用)
- 新しい TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
- {
- var接続= 新しい SqlConnection(接続文字列);
-
- 試す
- {
- var options = new DbContextOptionsBuilder<BloggingContext>()
- .UseSqlServer(接続)
- .オプション;
-
- (var context = new BloggingContext(options)) を使用します
- {
- コンテクスト。データベース.OpenConnection();
- コンテクスト。データベース.EnlistTransaction(トランザクション);
-
- //トランザクション内で生のADO.NET コマンドを実行する
- var コマンド =接続.CreateCommand();
- command.CommandText = "dbo.Blogs から削除" ;
- コマンドを実行します。
-
- //トランザクション内でEF Coreコマンドを実行する
- コンテキスト。ブログ。 (新しいブログ { Url = "http://blogs.msdn.com/dotnet" }を追加します);
- コンテキスト.SaveChanges();
- コンテクスト。データベース.CloseConnection();
- }
-
- //専念 トランザクションすべてのコマンドが成功した場合、トランザクションは自動的にロールバックされます
- //どちらかのコマンドが失敗した場合に破棄される
- トランザクションをコミットします。
- }
- キャッチ(例外)
- {
- // TODO: 失敗を処理する
- }
- }
System.Transactions の制限- EF Core は、System.Transactions のサポートを実装するためにデータベース プロバイダーに依存しています。プロバイダーが System.Transactions のサポートを実装していない場合、これらの API への呼び出しは完全に無視される可能性があります。 SqlClient はこれをサポートしています。
- .NET Core 2.1 以降、System.Transactions 実装には分散トランザクションのサポートが含まれていないため、TransactionScope または CommittableTransaction を使用して複数のリソース マネージャー間でトランザクションを調整することはできません。
|