Spring.Net+WCF實現分布式事務
來源:程序員人生 發布時間:2015-04-27 08:37:21 閱讀次數:4367次
項目背景:ITOO.Teacher.Service提供1套訪問教師數據庫的WCF服務,ITOO.Student.Service提供1套訪問學生數據庫的WCF服務。學生服務真個B層在進行業務處理時,需要調用教師的WCF服務,我們需要在學生服務真個B層加上散布式事務處理,向教師庫和學生庫更新數據,要末都成功,要末都不成功。
1.在教師服務端,我們需要在WCF的接口上加上WCF散布式事務特性:
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
bool AddTeacher(TeacherViewModel vmTeacher);
在教師服務真個B層實現上加上WCF散布式事務特性: /// <summary>
/// 增加學生
/// </summary>
/// <param name="vmTeacher">教師ViewModel</param>
/// <returns>布爾值</returns>
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public bool AddTeacher(TeacherViewModel vmTeacher)
{
//創建轉換規則
Mapper.CreateMap<TeacherViewModel, TeacherEntity>();
//轉換實體
TeacherEntity enStudent = Mapper.Map<TeacherEntity>(vmTeacher);
//調用dal層增加方法
this.CurrentDal.Add(enStudent);
//提交事務,返回結果
return this.DbSession.SaveChanges() > 0;
}
2.在學生服務真個B層采取system.transactions進行散布式事務處理:
public void AddStudentTeacher(StudentViewModel vmStudent)
{
//創建轉換規則
Mapper.CreateMap<StudentViewModel, StudentEntity>();
//轉換實體
StudentEntity enStudent = Mapper.Map<StudentEntity>(vmStudent);
//調用dal層增加方法
this.CurrentDal.Add(enStudent);
this.DbSession.SaveChanges();
//調用老師的添加方法
ITeacherContracts teacherContracts = ServiceFactory.GetTeacherService();
TeacherViewModel vmTeacher = new TeacherViewModel { TeacherID = "123", TeacherName = "11" };
teacherContracts.AddTeacher(vmTeacher);
}
3.由于每一個事務處理都需要using TransactionScope、 trans.Complete,所以我們用Spring.Net的AOP管理這些相同的處理:
public class AroundAdvice : IMethodInterceptor
{
public object Invoke(IMethodInvocation invocation)
{
object result;
using (TransactionScope trans = new TransactionScope())
{
result = invocation.Proceed();
trans.Complete();
}
return result;
}
}
4.配置數據庫服務器的MSDTC服務:
4.1開啟MSDTC服務,在DOS中輸入net start msdtc;
4.2設置MSDTC,在DOS中輸入dcomcnfg.exe,按下圖所示設置:

4.3關閉windows防火墻;
4.4開啟數據庫的散布式事務支持,設置以下圖所示:

當前版本是用system.transactions實現的散布式事務,用Spring.Net的AOP切了1下,至于Spring.Net的聲明式事務是不是可以實現對WCF散布式事務的管理,這個還有待研究。
框架的源碼下載地址:http://pan.baidu.com/s/1hqvOC6K (最好用VS2012打開)。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈