.NET 9.0 的 Blazor Web App 項目中 EF Core 【事務】使用備忘

一、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.pswp.cn/news/895807.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895807.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895807.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

記一次 Git Fetch 后切換分支為空的情況

Git Fetch 后切換分支為空的情況 在使用 Git 時&#xff0c;我遇到這樣的情況&#xff1a;執行 git fetch 后切換分支&#xff0c;發現工作目錄是空的&#xff0c;沒有任何文件&#xff0c;所以插眼記錄一下。 原因分析 git fetch 的作用&#xff1a;git fetch 只會從遠程倉庫…

UMLS數據下載及訪問

UMLS數據申請 這個直接在官網上申請即可&#xff0c;記得把地址填全&#xff0c;基本都會拿到lisence。 UMLS數據訪問 UMLS的數據訪問分為網頁訪問&#xff0c;API訪問以及數據下載后的本地訪問&#xff0c;網頁訪問&#xff0c;API訪問按照官網的指示即可&#xff0c;這里主…

使用 Docker 部署 Apache Spark 集群教程

簡介 Apache Spark 是一個強大的統一分析引擎&#xff0c;用于大規模數據處理。本文將詳細介紹如何使用 Docker 和 Docker Compose 快速部署一個包含一個 Master 節點和兩個 Worker 節點的 Spark 集群。這種方法不僅簡化了集群的搭建過程&#xff0c;還提供了資源隔離、易于擴…

瑞薩RA-T系列芯片ADCGPT功能模塊的配合使用

在馬達或電源工程中&#xff0c;往往需要采集多路AD信號&#xff0c;且這些信號的優先級和采樣時機不相同。本篇介紹在使用RA-T系列芯片建立馬達或電源工程時&#xff0c;如何根據需求來設置主要功能模塊ADC&GPT&#xff0c;包括采樣通道打包和分組&#xff0c;GPT觸發啟動…

20250217 隨筆 redis非原子性操作簡述

從你提供的文本來看&#xff0c;核心是 Redis 作為緩存的檢查機制&#xff0c;以及非原子性操作導致的不一致性問題。 我們可以拆解為兩個部分來理解&#xff1a; &#x1f4cc; 1. 邏輯&#xff1a;先查 Redis&#xff0c;再決定是否注冊 邏輯流程 先查詢 Redis 是否有某個 …

git-提交時間和作者時間的區別

1.介紹 定義介紹 提交時間&#xff08;Committer Date&#xff09;&#xff1a;決定了提交在 Git 歷史中的位置&#xff0c;通常影響 GitHub 上提交顯示的順序。 作者時間&#xff08;Author Date&#xff09;&#xff1a;雖然不影響提交的排序&#xff0c;但在每個提交詳情頁…

PHP框架入門指南:從零構建現代Web應用

一、為什么需要PHP框架? 1.1 傳統PHP開發的痛點 重復造輪子:用戶認證、表單驗證等基礎功能需要反復開發代碼混亂:缺乏統一結構導致維護困難安全漏洞:手動處理SQL注入/XSS攻擊效率低下擴展性差:耦合代碼難以適應業務增長1.2 框架的核心價值 標準化架構:MVC模式強制代碼分…

Leetcode 146 LRU緩存 的三種解法

146. LRU 緩存 請你設計并實現一個滿足 LRU (最近最少使用) 緩存 約束的數據結構。 實現 LRUCache 類&#xff1a; LRUCache(int capacity) 以 正整數 作為容量 capacity 初始化 LRU 緩存int get(int key) 如果關鍵字 key 存在于緩存中&#xff0c;則返回關鍵字的值&#xff0…

尚硅谷 java 學習Day19 抽象類與抽象方法、接口、內部類

6-5 抽象類(abstract)與抽象方法&#xff08;important&#xff09; 一、什么叫抽象類&#xff1a; 有時候將一個父類設計的非常抽象&#xff0c;以至于它沒有具體的實例&#xff0c;這樣的類稱為抽象類 abstract關鍵字的使用&#xff1a; ? 1、abstract:抽象的 ? 2、abs…

【LeetCode Hot100 鏈表(上)】相交鏈表、反轉鏈表、回文鏈表、環形鏈表、合并兩個有序鏈表、兩數相加

鏈表 1. 相交鏈表問題描述解決思路代碼實現 2. 反轉鏈表問題描述解決思路代碼實現 3. 回文鏈表問題描述解決思路代碼實現 4. 環形鏈表問題描述解決思路代碼實現 5. 環形鏈表II問題描述解決思路代碼實現 6. 合并兩個有序鏈表問題描述解決思路代碼實現 7. 兩數相加問題描述解決思…

【Python pro】基本數據類型

一、數字類型 1.1 數字類型的組成 1.1.1 整數 &#xff08;1&#xff09;十進制&#xff0c;二進制0b&#xff0c;八進制0o&#xff0c;十六進制0x print(16 0b10000 0o20 0x10) # 輸出&#xff1a;True&#xff08;2&#xff09;十進制轉其他進制 a bin(16) b oct(1…

拯救者電腦在重裝系統之后電源計劃丟失Fn+Q切換不了模式怎么恢復?

參考聯想知識庫的一下鏈接&#xff1a; https://iknow.lenovo.com.cn/detail/196192 其中下載的解壓文件后的文件需要復制粘貼到D盤的根目錄下&#xff0c;再來運行文件。若在生成的log文件中看到導入成功以及控制面板中看到已添加的電源計劃即可 如果還是無效可是試試以下的…

ubuntu 執行 sudo apt-get update 報錯

記錄一下&#xff0c;遇到這個問題了&#xff0c;網絡上看到的解決辦法&#xff0c;親測有效 執行sudo apt-get update ,卻報以下錯誤&#xff0c;“SECURITY: URL redirect target contains control characters rejecting ” 經檢查發現&#xff0c;/etc/apt/source.list 下的…

深度集成DeepSeek大模型:WebSocket流式聊天實現

目錄 5分鐘快速接入DeepSeek大模型&#xff1a;WebSocket實時聊天指南創建應用開發后端代碼 (Python/Node.js)結語 5分鐘快速接入DeepSeek大模型&#xff1a;WebSocket實時聊天指南 創建應用 訪問DeepSeek官網 前往 DeepSeek官網。如果還沒有賬號&#xff0c;需要先注冊一個。…

java斷點調試(debug)

在開發中&#xff0c;新手程序員在查找錯誤時, 這時老程序員就會溫馨提示&#xff0c;可以用斷點調試&#xff0c;一步一步的看源碼執行的過程&#xff0c;從而發現錯誤所在。 重要提示: 斷點調試過程是運行狀態&#xff0c;是以對象的運行類型來執行的 斷點調試介紹 斷點調試是…

軟件技術實訓室解決方案(2025年最新版)

軟件產業作為新興產業的核心組成部分&#xff0c;是推動數字經濟發展的重要力量。在“十四五”規劃的新機遇與挑戰下&#xff0c;我國已明確將加強關鍵數字技術創新應用作為戰略重點&#xff0c;并將軟件和信息技術服務業的發展列為重中之重。這不僅是為了加速構建現代產業體系…

foobar2000設置DSP使用教程及軟件推薦

foobar2000安卓中文版&#xff1a;一款高品質手機音頻播放器 foobar2000安卓中文版是一款備受好評的高品質手機音頻播放器。 幾乎支持所有的音頻格式&#xff0c;包括 MP3、MP4、AAC、CD 音頻等。不論是經典老歌還是最新的流行音樂&#xff0c;foobar2000都能完美播放。除此之…

DeepSeek企業級部署實戰指南:從服務器選型到Dify私有化落地

對于個人開發者或嘗鮮者而言&#xff0c;本地想要部署 DeepSeek 有很多種方案&#xff0c;但是一旦涉及到企業級部署&#xff0c;則步驟將會繁瑣很多。 比如我們的第一步就需要先根據實際業務場景評估出我們到底需要部署什么規格的模型&#xff0c;以及我們所要部署的模型&…

I2C、SPI、UART

I2C&#xff1a;串口通信&#xff0c;同步&#xff0c;半雙工&#xff0c;雙線&#xff08;數據線SDA時鐘線SCL&#xff09;&#xff0c;最大距離1米到幾米 SPI&#xff08;串行外設接口&#xff09;&#xff1a;串口通信&#xff0c;同步&#xff0c;全雙工&#xff0c;四線&…

uniapp 連接mqtt

1&#xff1a;下載插件 npm install mqtt 2&#xff1a;創建 mqtt.js /* main.js 項目主入口注入實例 */ // import mqttTool from ./lib/mqttTool.js // Vue.prototype.$mqttTool mqttTool/* 使用范例見 /pages/index/index.vue */ // mqtt協議&#xff1a;H5使用ws/wss APP-…