EF架構~TransactionScope與SaveChanges的關系


回到目錄

TransactionScope是.net環境下的事務,可以提升為分布式事務,這些知識早在很久前就已經說過了,今天不再說它,今天主要談談Savechanges()這個方法在TransactionScope塊里的作用,我們知識TransactionScope只有顯示的提交動作而沒有回滾,那么它如何實現回滾呢?事實上,.net從來就是一門不啰嗦的語言,它把回滾理解為:"當程序出現問題時,就是回滾的時候"!

提交出現問題的表現?

  1. 就是throw出來的異常
  2. 當前你可以不加try...catch塊,也會throw出來
  3. 當你加了try...catch,而又沒有throw出來,那你的事務中的回滾就失效了,即數據的一致性沒有保正了

所以,如果你要封裝自己的savechanges方法,就必須把異常顯示的拋出來,像這樣的代碼是正常的

       protected virtual void SaveChanges()
        {
            try
            {
                Db.SaveChanges();
            }
            catch (DbUpdateConcurrencyException)
            {
                throw new DbUpdateConcurrencyException("Lind.DDD框架在更新時引起了樂觀並發,后修改的數據不會被保存");
            }
            catch (DbEntityValidationException ex)
            {
                List<string> errorMessages = new List<string>();
                foreach (DbEntityValidationResult validationResult in ex.EntityValidationErrors)
                {
                    string entityName = validationResult.Entry.Entity.GetType().Name;
                    foreach (DbValidationError error in validationResult.ValidationErrors)
                    {
                        errorMessages.Add(entityName + "." + error.PropertyName + ": " + error.ErrorMessage);
                    }
                }
                throw;
            }
            catch (Exception)
            {
                throw;
            }

        }

而事實上,我們在UI層或者應用層,可以把異常消化,因為你的頁面可能不希望看到500的錯誤,當然你也可以設置全局的500,404,403等錯誤頁!

像這樣代碼,把異常消化,對事務是沒有影響的,事務能否回滾,只與saveChanges()有關!

            try
            {
                InsertData();
            }
            catch (Exception ex)
            {

                Console.WriteLine(ex.Message);
            }

感謝各位的閱讀!

回到目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM