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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...