深入分析EFCore事务提交,分布式事务

深入分析EF Core事务提交,分布式事务

作者:conan 2021-03-17 00:05:50

开发

前端

分布式 虽然所有关系数据库提供程序都支持事务,但在调用事务 API 时,可能会引发其他提供程序类型或不执行任何操作。

本文转载自微信公众号「后端Q」,作者conan。转载本文请联系后端Q公众号。

控制事务

可以使用 DbContext.Database API 开始、提交和回滚事务。 以下示例显示了在单个事务中执行的两个 SaveChanges 操作以及一个 LINQ 查询:

  
 
 
  1. using var context = new BloggingContext();
  2. using var transaction = context.Database.BeginTransaction();
  3. try
  4. {
  5.     context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });
  6.     context.SaveChanges();
  7.     context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/visualstudio" });
  8.     context.SaveChanges();
  9.     var blogs = context.Blogs
  10.         .OrderBy(b => b.Url)
  11.         .ToList();
  12.     // Commit transaction if all commands succeed, transaction will auto-rollback
  13.     // when disposed if either commands fails
  14.     transaction.Commit();
  15. }
  16. catch (Exception)
  17. {
  18.     // TODO: Handle failure
  19. }

虽然所有关系数据库提供程序都支持事务,但在调用事务 API 时,可能会引发其他提供程序类型或不执行任何操作。

使用 System.Transactions

如果需要跨较大作用域进行协调,则可以使用环境事务。

  
 
 
  1. using (var scope = new TransactionScope(
  2.     TransactionScopeOption.Required,
  3.     new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
  4. {
  5.     using var connection = new SqlConnection(connectionString);
  6.     connection.Open();
  7.     try
  8.     {
  9.         // Run raw ADO.NET command in the transaction
  10.         var command = connection.CreateCommand();
  11.         command.CommandText = "DELETE FROM dbo.Blogs";
  12.         command.ExecuteNonQuery();
  13.         // Run an EF Core command in the transaction
  14.         var options = new DbContextOptionsBuilder()
  15.             .UseSqlServer(connection)
  16.             .Options;
  17.         using (var context = new BloggingContext(options))
  18.         {
  19.             context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });
  20.             context.SaveChanges();
  21.         }
  22.         // Commit transaction if all commands succeed, transaction will auto-rollback
  23.         // when disposed if either commands fails
  24.         scope.Complete();
  25.     }
  26.     catch (Exception)
  27.     {
  28.         // TODO: Handle failure
  29.     }
  30. }

还可以在显式事务中登记。

  
 
 
  1. using (var transaction = new CommittableTransaction(
  2.     new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
  3. {
  4.     var connection = new SqlConnection(connectionString);
  5.     try
  6.     {
  7.         var options = new DbContextOptionsBuilder()
  8.             .UseSqlServer(connection)
  9.             .Options;
  10.         using (var context = new BloggingContext(options))
  11.         {
  12.             context.Database.OpenConnection();
  13.             context.Database.EnlistTransaction(transaction);
  14.             // Run raw ADO.NET command in the transaction
  15.             var command = connection.CreateCommand();
  16.             command.CommandText = "DELETE FROM dbo.Blogs";
  17.             command.ExecuteNonQuery();
  18.             // Run an EF Core command in the transaction
  19.             context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });
  20.             context.SaveChanges();
  21.             context.Database.CloseConnection();
  22.         }
  23.         // Commit transaction if all commands succeed, transaction will auto-rollback
  24.         // when disposed if either commands fails
  25.         transaction.Commit();
  26.     }
  27.     catch (Exception)
  28.     {
  29.         // TODO: Handle failure
  30.     }
  31. }

System.Transactions 的限制

  1. EF Core 依赖数据库提供程序以实现对 System.Transactions 的支持。 如果提供程序未实现对 System.Transactions 的支持,则可能会完全忽略对这些 API 的调用。 SqlClient 支持它。
  2. 自 .NET Core 2.1 起,System.Transactions 实现不包括对分布式事务的支持,因此不能使用 TransactionScope 或 CommittableTransaction 来跨多个资源管理器协调事务。

名称栏目:深入分析EFCore事务提交,分布式事务
本文网址:http://www.shufengxianlan.com/qtweb/news2/392102.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联