本文討論面向對象程序語言中,事務管理的思想。
注意:本文代碼中涉及到事務管理的上下文,是我探索ORM原理時自制的上下文,讀者只要看着去理解他的意思就好了,實戰當中我用的是另外開源框架中的上下文。
事務管理應該放在哪一層做
事務的開始與提交應該放在哪里呢?業務邏輯層還是數據訪問層?
我以為,數據訪問層需要,業務邏輯層也需要。
這樣業務層就可以組合倉儲的數據庫操作,隨意組合成一個事務,而倉儲才可以被重用。
那么具體如何實現呢?
業務層的事務,這里引入了System.Transactions命名空間,userRep.Save(user2);這段就是剛才看到的,包含了一個事務的倉儲,
執行tx.Complete();才會走完這個事務,如果在using中出現了異常,那么所有事務都將回滾。
[Test] public void TranTest() { IDataContext context = DataContextFactory.GetDataContext(); Department dept = context.Get<Department>(1); User user1 = new User() { LoginName = "adama1", Name = "adama1", Password = "123123", Department = dept }; User user2 = new User() { LoginName = "adama2", Name = "adama2", Password = "123123", Department = dept }; IUserRepository userRep = RepostoryFactory.GetFor<User>() as IUserRepository; using (TransactionScope tx = new TransactionScope()) { context.Add(user1); userRep.Save(user2); tx.Complete(); } }
注:使用TransactionScope可能會將事務升級為分布式事務。
在Java EE中,我見過事務管理出現在DomainService,也見過它出現在MVC的Controller,SpringMvc整合Hibernate后以注解的形式出現。
然而,在.NET中,也有MVC+Spring.NET+NHibernate,只不過與微軟MVC整合得不完全,需要手動為每個控制器寫XML配置,好在MVC提供我們擴展的功能,我們可以利用反射機制免去手動寫XML配置。
現在我已經完成了整合,這不是演習代碼,如下圖:
Repository
Service
MVC Controller
UI