.NET 9.0 的 Blazor Web App 项目中 EF Core 【事务】使用备忘

embedded/2025/2/22 18:07:25/

一、DbContext.Database.BeginTransactionAsync() 模式

1. 注意事项:连接字符串中启用了 MARS(Multiple Active Result Sets:MultipleActiveResultSets=True )后,无法创建 保存点(保存点与 SQL Server 的多重活动结果集不兼容),此时,使用注入的 DbContext(例如:@inject ApplicationDbContext  FirstDb) 将报错。解决办法:在 事务 中自己 new 一个 DbContext。

  "ConnectionStrings": {"Ky1SqlServerConnection": "Server=localhost;Database=kyglxt;Trusted_Connection=True;MultipleActiveResultSets=True;TrustServerCertificate=True;User=sa;Password=123456","Ky2SQLiteConnection": "Data Source=SQLiteFile.db",}

 上述语句为 appsettings.json 中保存的 连接字符串。

/* SQL Server 事务测试 —— ok
*  注:Multiple Active Result Sets(MARS) is enabled:MultipleActiveResultSets = True; 时,不能使用注入的 DbContext,在 事务 中自己 new 一个 DbContext。*/
try
{using (var FirstDb = new KyglxtContext(new DbContextOptionsBuilder<KyglxtContext>().UseSqlServer(AppsettingsJsonService.Configuration["ConnectionStrings:Ky1SqlServerConnection"]).Options)){var transaction = await FirstDb.Database.BeginTransactionAsync();var FirstDbEntity01 = new 用户表 { 用户名 = $"Entity in FirstDb:{DateTime.Now}" };FirstDb.Add(FirstDbEntity01);await FirstDb.SaveChangesAsync();System.Console.WriteLine("————save 1,end");await Task.Delay(2000);System.Console.WriteLine("————delay end");var FirstDbEntity02 = new 用户表 { 名称 = $"Entity in FirstDb:{DateTime.Now}" };FirstDb.Add(FirstDbEntity02);await FirstDb.SaveChangesAsync();System.Console.WriteLine("————save 2,end");// Commit transaction if all commands succeed, transaction will auto-rollback when disposed if either commands failsawait transaction.CommitAsync();System.Console.WriteLine("————try,ok");}
}
catch (Exception ex)
{System.Console.WriteLine(ex.Message);System.Console.WriteLine(ex.InnerException?.Message);
}
finally { }

2. 对于 环境事务(TransactionScope) ,SQLite 不支持,针对多个数据库使用 事务 功能时,不能包含 SQLite。解决办法1:生产环境,SQLite 换成 SQL Server 。解决办法2:手动处理。

 /* 手动处理 多个数据库,支持 SQLite */try{using var FirstDb = new KyglxtContext(new DbContextOptionsBuilder<KyglxtContext>().UseSqlServer(AppsettingsJsonService.Configuration["ConnectionStrings:Ky1SqlServerConnection"]).Options);using var SecondDb = new ApplicationDbContext(new DbContextOptionsBuilder<ApplicationDbContext>().UseSqlite(AppsettingsJsonService.Configuration["ConnectionStrings:Ky2SQLiteConnection"]).Options);var FirstTransaction = await FirstDb.Database.BeginTransactionAsync();var SecondTransaction = await SecondDb.Database.BeginTransactionAsync();try{var firstEntity = new 用户表 { 用户名 = $"BeginTransactionAsync,2:{DateTime.Now}" };FirstDb.Add(firstEntity);await FirstDb.SaveChangesAsync();System.Console.WriteLine("FirstDb————save 1,end");await Task.Delay(2000);System.Console.WriteLine("BeginTransactionAsync,2————————delay end");var secondEntity = new ApplicationUser { UserName = $"BeginTransactionAsync,2:{DateTime.Now}" };SecondDb.Add(secondEntity);await SecondDb.SaveChangesAsync();System.Console.WriteLine("SecondDb————save 2,end");await FirstTransaction.CommitAsync();await SecondTransaction.CommitAsync();System.Console.WriteLine("BeginTransactionAsync,2——————try,ok");}catch (Exception ex){await FirstTransaction.RollbackAsync();await SecondTransaction.RollbackAsync();System.Console.WriteLine($"BeginTransactionAsync,2——————catch,{ex.Message}");System.Console.WriteLine($"BeginTransactionAsync,2——————catch,{ex.InnerException?.Message}");}}catch (Exception ex){System.Console.WriteLine($"BeginTransactionAsync,2——————catch,{ex.Message}");System.Console.WriteLine($"BeginTransactionAsync,2——————catch,{ex.InnerException?.Message}");}finally{System.Console.WriteLine("BeginTransactionAsync,2——————finally:");}

二、环境事务,System.Transactions、TransactionScope:支持操作多个数据库

 /* 环境事务:支持操作多个数据库,但是 SQLite 不支持 TransactionScope */try{using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)){using (var FirstDb = new KyglxtContext(new DbContextOptionsBuilder<KyglxtContext>().UseSqlServer(AppsettingsJsonService.Configuration["ConnectionStrings:Ky1SqlServerConnection"]).Options)){var firstEntity = new 用户表 { 用户名 = $"TransactionScope:{DateTime.Now}" };FirstDb.Add(firstEntity);await FirstDb.SaveChangesAsync();System.Console.WriteLine("FirstDb————save 1,end");await Task.Delay(2000);System.Console.WriteLine("TransactionScope————————delay end");using (var SecondDb = new ApplicationDbContext(new DbContextOptionsBuilder<ApplicationDbContext>().UseSqlite(AppsettingsJsonService.Configuration["ConnectionStrings:Ky2SQLiteConnection"]).Options)){var secondEntity = new ApplicationUser { UserName = $"TransactionScope:{DateTime.Now}" };SecondDb.Add(secondEntity);await SecondDb.SaveChangesAsync();}System.Console.WriteLine("SecondDb————save 2,end");}// Commit transaction if all commands succeed, transaction will auto-rollback when disposed if either commands failsscope.Complete();System.Console.WriteLine("TransactionScope——————try,ok");}}catch (Exception ex){// Handle the exception (e.g., log it)System.Console.WriteLine($"TransactionScope——————catch,{ex.Message}");System.Console.WriteLine($"TransactionScope——————catch,{ex.InnerException?.Message}");}finally{System.Console.WriteLine("TransactionScope——————finally:");}


http://www.ppmy.cn/embedded/164406.html

相关文章

java(spring boot)实现向deepseek/GPT等模型的api发送请求/多轮对话(附源码)

我们再启动应用并获取api密钥后就可以对它发送请求了&#xff0c;但是官方文档对于如何进行多轮对话以及怎么自定义参数并没有说的很清楚&#xff0c;给的模板也没有java的&#xff0c;因此我们需要自己实现。 import org.json.JSONArray; import org.json.JSONObject;import j…

LeetCode100 力扣热题100 岛屿数量

题目背景 这个问题是岛屿数量问题&#xff0c;给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水域&#xff09;组成的网格&#xff0c;计算并返回其中岛屿的数量。一个岛屿是由相邻的陆地组成&#xff0c;陆地可以是水平或垂直相邻。 思路 我们可以使用深度优先搜索…

nginx配置:nginx.conf配置文件

nginx.conf配置文件说明 基本结构 全局块&#xff1a;位于最外层&#xff0c;定义影响整个Nginx服务器的设置。事件块&#xff1a;配置网络连接相关的设置。HTTP块&#xff1a;定义HTTP服务器以及反向代理、负载均衡等特性。Server块&#xff1a;定义虚拟主机&#xff0c;即响…

汽车长期不保养的危害

汽车两三年不保养会对车辆的多个系统和部件产生严重危害&#xff0c;以下将详细阐述&#xff1a; 发动机系统 润滑系统问题 机油在发动机中起着润滑、冷却、清洁和密封的重要作用。长时间不更换机油&#xff0c;机油会因氧化、污染等原因变质&#xff0c;其润滑性能大幅下降。…

【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 常见组件(二) -> tabs

目录 1 -> 创建Tabs 2 -> 设置Tabs方向 3 -> 设置样式 4 -> 显示页签索引 5 -> 场景示例 1 -> 创建Tabs 在pages/index目录下的hml文件中创建一个Tabs组件。 <!-- index.hml --> <div class"container" ><tabs> <tab-…

深入理解Zookeeper:分布式系统的协调者

引言 在现代分布式系统中&#xff0c;协调和管理多个节点之间的状态和行为是一个复杂且关键的任务。Zookeeper作为一个分布式协调服务&#xff0c;为开发者提供了一种高效、可靠的方式来处理分布式系统中的一致性问题。本文将介绍Zookeeper的基本概念、使用场景以及如何通过示…

Git是什么

简单介绍&#xff1a; Git是一个分布式版本控制系统&#xff0c;用于跟踪文件的更改&#xff0c;特别是在多人协作开发的环境中。 Key: 分布式 版本控制 系统 最常用于软件开发&#xff0c;但也可以用于管理任何类型的文件和文件夹。 Git帮助团队跟踪和管理文件的历史版本&a…

前端(AJAX)学习笔记(CLASS 2):图书管理案例以及图片上传

* BootStrap弹框 功能&#xff1a;不离开当前页面&#xff0c;显示单独内容&#xff0c;供用户操作 步骤&#xff1a; 1、引入bootstrap.css和bootstrap.js 2、准备弹框标签&#xff0c;确认结构 3、通过自定义属性&#xff0c;控制弹框的显示和隐藏 其中的bootstrap.css…