文章出處
文章列表
TransactionScope是.net環境下的事務,可以提升為分布式事務,這些知識早在很久前就已經說過了,今天不再說它,今天主要談談Savechanges()這個方法在TransactionScope塊里的作用,我們知識TransactionScope只有顯示的提交動作而沒有回滾,那么它如何實現回滾呢?事實上,.net從來就是一門不啰嗦的語言,它把回滾理解為:"當程序出現問題時,就是回滾的時候"!
提交出現問題的表現?
- 就是throw出來的異常
- 當前你可以不加try...catch塊,也會throw出來
- 當你加了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); }
感謝各位的閱讀!
文章列表
全站熱搜