EF架構~TransactionScope與(yu)SaveChanges的(de)關系
TransactionScope是.net環境下的事務,可以提升為分布式事務,這些知識早在很久前就已經說過了,今天不再說它,今天主要談談Savechanges()這個方法在TransactionScope塊里的作用,我們知識TransactionScope只有顯示的提交動作而沒有回滾,那么它如何實現回滾呢?事實上,.net從來就是一門不啰嗦的語言,它把回滾理解為:"當程序出現問題時,就是回滾的時候"!
提交出現問題(ti)的表現?
- 就是throw出來的異常
- 當前你可以不加try...catch塊,也會throw出來
- 當你加了try...catch,而又沒有throw出來,那你的事務中的回滾就失效了,即數據的一致性沒有保正了
所(suo)以,如果(guo)你要封(feng)裝(zhuang)自己(ji)的(de)savechanges方法,就必(bi)須(xu)把(ba)異常顯示(shi)的(de)拋出(chu)來,像這樣的(de)代碼是正常的(de)
protected virtual void SaveChanges() { try { Db.SaveChanges(); } catch (DbUpdateConcurrencyException) { throw new DbUpdateConcurrencyException("Lind.DDD框(kuang)架(jia)在更新(xin)時引起了樂(le)觀并發,后修(xiu)改的數據不會被保存"); } 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層(ceng)或(huo)者(zhe)應用層(ceng),可(ke)以把異常(chang)消化(hua),因為(wei)你(ni)的(de)頁面可(ke)能(neng)不希望看到500的(de)錯誤(wu)(wu),當然(ran)你(ni)也可(ke)以設置全(quan)局的(de)500,404,403等(deng)錯誤(wu)(wu)頁!
像這樣代碼,把異常消化,對事務是沒有影響的,事務能否回滾,只與saveChanges()有關!
try { InsertData(); } catch (Exception ex) { Console.WriteLine(ex.Message); }
感謝各位的閱讀!