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

IT科技类资讯2025-11-05 01:27:40156

本文转载自微信公众号「后端Q」,深入事务式事作者conan。分析分布转载本文请联系后端Q公众号。提交  

控制事务

可以使用 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 fails     transaction.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 transaction         var command = connection.CreateCommand();         command.CommandText = "DELETE FROM dbo.Blogs";         command.ExecuteNonQuery();         // Run an EF Core command in the transaction         var 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 fails         scope.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 transaction             var command = connection.CreateCommand();             command.CommandText = "DELETE FROM dbo.Blogs";             command.ExecuteNonQuery();             // Run an EF Core command in the transaction             context.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 fails         transaction.Commit();     }     catch (Exception)     {         // TODO: Handle failure     } } 

System.Transactions 的限制

EF Core 依赖数据库提供程序以实现对 System.Transactions 的支持。 如果提供程序未实现对 System.Transactions 的深入事务式事支持,亿华云计算则可能会完全忽略对这些 API 的分析分布调用。 SqlClient 支持它。提交 自 .NET Core 2.1 起,System.Transactions 实现不包括对分布式事务的支持,因此不能使用 TransactionScope 或 CommittableTransaction 来跨多个资源管理器协调事务。亿华云
本文地址:http://www.bzuk.cn/html/233d33299434.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

全站热门

电脑操作指南(教您快速、简单地通过电脑修改WiFi密码)

Yarn调度器(Scheduler)详解

安全工程师必知:常见Java漏洞有哪些?

爱不释手的7个VS Code扩展,妙啊

掌握Mac电脑新系统的技巧与窍门(从入门到精通,轻松驾驭Mac电脑新系统)

冷饭新炒:理解JDK中UUID的底层实现

25条很棒的Python一行代码,建议收藏!

DevOps-需求管理工具-Jira安装部署

友情链接

滇ICP备2023006006号-33