Abp之工作單元與事務

来源:http://www.cnblogs.com/kid1412/archive/2017/01/26/6352212.html
-Advertisement-
Play Games

環境:Abp1.2 疑問:沒有調用工作單元的SaveChanges方法引起的事務提交時機的問題. 例如:有一個應用服務代碼如下: 根據用戶提交數據插入一條記錄,但在方法末未顯式調用SaveChanges方法 在Mvc的Controller里調用上述方法的代碼如下: 在_phraseAppServic ...


 

環境:Abp1.2

疑問:沒有調用工作單元的SaveChanges方法引起的事務提交時機的問題.

例如:有一個應用服務代碼如下:

 public void CreatePhrase(PhraseCreateDto input)
        {var phrase = Mapper.Map<Phrase>(input);
                phrase.Id = Guid.NewGuid();
                _phraseRepository.Insert(phrase); 
        }

根據用戶提交數據插入一條記錄,但在方法末未顯式調用SaveChanges方法

在Mvc的Controller里調用上述方法的代碼如下:

   [AbpAuthorize]
        public ActionResult Create()
        {
            ViewBag.Count = _phraseAppService.GetCount();
            return View();
        }

        [AbpAuthorize]
        [HttpPost]
        [ValidateInput(false)]
        public ActionResult Create(FormCollection fc)
        {
            CheckModelState();

            if ((fc.Get("editorValue") != null) && (fc.Get("ChineseMean") != null))
            {
                //ueditor有時會在最後多出一個br換行,需要去掉.
                var sentenceHtml = fc.Get("editorValue");

                var phrase = new PhraseCreateDto
                {
                    ChineseMean = fc.Get("ChineseMean"),
                    SentenceHtml = sentenceHtml,
                    //1.去掉Html標簽 2.把單引號,雙引號等被轉義的字元轉回來.
                    Sentence = Server.HtmlDecode(Common.ReplaceHtmlMark(sentenceHtml))
                };
                _phraseAppService.CreatePhrase(phrase);
            }

            return Create();
        }

在_phraseAppService.CreatePhrase(phrase),插入記錄之後,再調用無參的Create方法,在Create方法里ViewBag.Count = _phraseAppService.GetCount()得到的記錄數,仍然是原來的記錄數(並沒有+1),也就是說插入數據發生在獲取記錄數之後,如果在CreatePhrase方法末顯式調用當前工作單元的SaveChanges方法,每次就能獲得最新的記錄數:

        public void CreatePhrase(PhraseCreateDto input)
        {var phrase = Mapper.Map<Phrase>(input);
                phrase.Id = Guid.NewGuid();
                _phraseRepository.Insert(phrase);
            CurrentUnitOfWork.SaveChanges();
    }

 

還有一點需要註意:工作單元與事務這二者的關係,假如有如下代碼:

        public void CreatePhrase(PhraseCreateDto input)
        {  
            using (var uow=UnitOfWorkManager.Begin())
            {
                var phrase = Mapper.Map<Phrase>(input);
                phrase.Id = Guid.NewGuid();
                _phraseRepository.Insert(phrase);          
                uow.Complete();
            }
            throw new Exception($"the exception inner {nameof(CreatePhrase)}");
        }

在調用UnitOfWorkHanle的Complete之後,拋出一個異常,那麼有沒有插入數據呢?答案是不一定,因為在應用服務方法里預設的就是一個工作單元,再在方法裡面建一個更小範圍的工作單元,並不一定會創建一個事務,而有可能使用已經有的事務,而已有的事務歸外層的工作單元管理,所以調用Complete方法並不會提交事務,所以拋出異常後,外層的工作單元就會回滾事務.

不過Begin有幾個重載,例如:

Required:預設值,如果事務不存在則新建,如果已存在,則用之.

RequiresNew:始終新建事務.所以如果使用:var uow=UnitOfWorkManager.Begin(TransactionScopeOption.RequiresNew),則在拋出異常前提交事務.

Suppress:無需周圍事務上下文,工作單元域內的所有操作會被提交.

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Channel的音頻引擎是我自己寫的,保存文件一直想找開源庫但就是找不著。。 於是就有了以下簡單粗暴打點辦法: 首先是WAV的文件格式: 起始地址 占用空間 本地址數字的含義 00H 4byte RIFF,資源交換文件標誌。 04H 4byte 從下一個地址開始到文件尾的總位元組數。高位位元組在後面,這 ...
  • 起因 在某些情況下,有將從某種類型的語言翻譯成另一種類型語言的需求。比如在生成實體時,可能需要將中文名稱轉換成英文。於是利用CEFSharp山寨了一個翻譯器。效果圖如下: CEF簡介 CEF全稱為Chromium Emmbed Framework,是一個開源項目。用於嵌入基於 Google Chro ...
  • 微信公眾號作為一個平臺級別的產品,對商業應用來說,有很大的吸引力。如何讓公眾號更好的吸粉?靠內容不是一般小商戶可以做到的,那是網紅自媒體的強項。一般商戶要怎麼突圍?那就是提供實用,有意義的功能給粉絲。 而微信公眾號自身功能是非常匱乏的,沒有什麼提供,連客服功能都幾乎沒有,所以這些那些的,就需要開發人 ...
  • 我們十分重視您的隱私。本隱私聲明解釋了我們從您那裡收集的個人數據內容以及我們將如何使用這些數據。 我們不收集任何與個人信息相關的數據,只收集與本UWP運行相關的數據,如: 產品使用數據:如每個頁面的使用次數和相互關係等。 設備數據:您使用的Windows 10設備在本UWP上的唯一設備ID。 錯誤報 ...
  • 需求: 要用WCF生成 Restful風格的介面,返回 JOSN格式: 過程: 1.使用 WCF的 webHttp 綁定。 2.為了增加程式編碼的靈活性,使用了有弱類型特性的 Dictionary<string,object>來作為json字元串對應的類。 3.WCF 預設的序列化不支持 Dicti ...
  • 基本語法 (菜鳥系列學習教程) C#,又名Csharp,天朝喜歡叫C井。 C#是一種面向對象的編程語言。在面向對象的程式設計方法中,程式有各種相互交互的對象組成。相同種類的對象通常具有相同的類型,或者說,是在先溝通那個的class中。 例如,以Rectangle(矩形)對象為例,它具有length和 ...
  • 原文地址:https://mellinoe.wordpress.com/2017/01/18/net core game engine/ 作者:ERIC MELLINO 翻譯: "楊曉東(Savorboard)" 譯者序 通過翻譯這篇文章,我感受到了 .NET Core 真正的魅力,它真的是無所不能 ...
  • SQLite什麼都好,就怕“database is locked”這些年來想盡辦法去規避它。測試代碼: static void Test2() { XCode.Setting.Current.TransactionDebug = true; XTrace.WriteLine(Role.Meta.Co ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...