EF Core事务提交,分布式事务
生活随笔
收集整理的這篇文章主要介紹了
EF Core事务提交,分布式事务
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
控制事務
可以使用?DbContext.Database?API 開始、提交和回滾事務。?以下示例顯示了在單個事務中執行的兩個?SaveChanges?操作以及一個 LINQ 查詢:
using var context = new BloggingContext(); using var transaction = context.Database.BeginTransaction();try {context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });context.SaveChanges();context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/visualstudio" });context.SaveChanges();var blogs = context.Blogs.OrderBy(b => b.Url).ToList();// Commit transaction if all commands succeed, transaction will auto-rollback// when disposed if either commands failstransaction.Commit(); } catch (Exception) {// TODO: Handle failure }雖然所有關系數據庫提供程序都支持事務,但在調用事務 API 時,可能會引發其他提供程序類型或不執行任何操作。
使用 System.Transactions
如果需要跨較大作用域進行協調,則可以使用環境事務。
using (var scope = new TransactionScope(TransactionScopeOption.Required,new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted })) {using var connection = new SqlConnection(connectionString);connection.Open();try{// Run raw ADO.NET command in the transactionvar command = connection.CreateCommand();command.CommandText = "DELETE FROM dbo.Blogs";command.ExecuteNonQuery();// Run an EF Core command in the transactionvar options = new DbContextOptionsBuilder<BloggingContext>().UseSqlServer(connection).Options;using (var context = new BloggingContext(options)){context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });context.SaveChanges();}// Commit transaction if all commands succeed, transaction will auto-rollback// when disposed if either commands failsscope.Complete();}catch (Exception){// TODO: Handle failure} }還可以在顯式事務中登記。
using (var transaction = new CommittableTransaction(new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted })) {var connection = new SqlConnection(connectionString);try{var options = new DbContextOptionsBuilder<BloggingContext>().UseSqlServer(connection).Options;using (var context = new BloggingContext(options)){context.Database.OpenConnection();context.Database.EnlistTransaction(transaction);// Run raw ADO.NET command in the transactionvar command = connection.CreateCommand();command.CommandText = "DELETE FROM dbo.Blogs";command.ExecuteNonQuery();// Run an EF Core command in the transactioncontext.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });context.SaveChanges();context.Database.CloseConnection();}// Commit transaction if all commands succeed, transaction will auto-rollback// when disposed if either commands failstransaction.Commit();}catch (Exception){// TODO: Handle failure} }System.Transactions 的限制
EF Core 依賴數據庫提供程序以實現對 System.Transactions 的支持。?如果提供程序未實現對 System.Transactions 的支持,則可能會完全忽略對這些 API 的調用。?SqlClient 支持它。
自 .NET Core 2.1 起,System.Transactions 實現不包括對分布式事務的支持,因此不能使用?TransactionScope?或?CommittableTransaction?來跨多個資源管理器協調事務。
總結
以上是生活随笔為你收集整理的EF Core事务提交,分布式事务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 应用程序自动更新组件GeneralUpd
- 下一篇: 如何在 ASP.Net Core 中使用