文章出處

回到目錄

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);
            }

感謝各位的閱讀!

回到目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()