当前位置:主页 > 查看内容

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

发布时间:2021-04-26 00:00| 位朋友查看

简介:本文转载自微信公众号「后端Q」,作者conan。转载本文请联系后端Q公众号。 控制事务 可以使用 DbContext.Database API 开始、提交和回滚事务。 以下示例显示了在单个事务中执行的两个 SaveChanges 操作以及一个 LINQ 查询: usingvarcontext=newBloggingCont……

 

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

控制事务

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

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

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

使用 System.Transactions

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

  1. using (var scope = new TransactionScope( 
  2.     TransactionScopeOption.Required, 
  3.     new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted })) 
  4.     using var connection = new SqlConnection(connectionString); 
  5.     connection.Open(); 
  6.  
  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.  
  14.         // Run an EF Core command in the transaction 
  15.         var options = new DbContextOptionsBuilder<BloggingContext>() 
  16.             .UseSqlServer(connection
  17.             .Options; 
  18.  
  19.         using (var context = new BloggingContext(options)) 
  20.         { 
  21.             context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" }); 
  22.             context.SaveChanges(); 
  23.         } 
  24.  
  25.         // Commit transaction if all commands succeed, transaction will auto-rollback 
  26.         // when disposed if either commands fails 
  27.         scope.Complete(); 
  28.     } 
  29.     catch (Exception) 
  30.     { 
  31.         // TODO: Handle failure 
  32.     } 

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

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

System.Transactions 的限制

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

本文转载自网络,原文链接:https://mp.weixin.qq.com/s/oAm8YNl8HqNKrA-8lioC0A
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文

  • 周排行
  • 月排行
  • 总排行

随机推荐