相关文章
将不确定变为确定~transactionscope何时提升为分布式事务
将不确定变为确定~transactionscope何时提升为分布式事务~续
将不确定变为确定~transactionscope何时提升为分布式事务~再续(避免引起不必要的MSDTC)
对于frameworks的TransactionScope大家应该都很熟悉了,它是一个分布式事务的语句块,被包含起来的语句可以一起被提交,当出现异常后,统一进行回滚,这一切都是托管的。
当WEB服务器没有开启MSDTC服务时,会出现这个提示:
对于servers.msc中的MSDTC服务,它经常性的被挂掉
注意一下:如果你的msdtc服务挂了,当下一次WWW程序需要用到它时,它会自由重启。
而对于你的事务块,如果这个MSDTC服务被挂了后,如果你的事务块中包含“跨库”操作,它将会被自动提升到MSDTC分布式事务,
这时你整个代码块将会中断,并抛出你的异常!
1 public abstract class DAL<T> : IDAL<T> where T : class 2 { 3 4 public DAL(DbContext db) 5 { 6 DB = db; 7 } 8 9 10 #region Properies 11 /// <summary> 12 /// 静态上下文 13 /// </summary> 14 // protected readonly static DbContext DB = new Entity.testEntities(); 15 16 /// <summary> 17 /// 实例上下文 18 /// </summary> 19 protected DbContext DB; 20 21 #endregion
1 using (TransactionScope trans = new TransactionScope()) 2 { 3 try 4 { 5 base.Insert(entity); 6 entity.User_Profile.ID = entity.ID; 7 user_ProfileDAL.Insert(entity.User_Profile); 8 loginLogsDAL.Insert(new Entity.TestMSDTC.LoginLogs //跨库操作 9 { 10 ID = entity.ID, 11 LoginName = entity.Name, 12 }); 13 trans.Complete(); 14 } 15 catch (Exception) 16 { 17 18 throw; 19 } 20 finally 21 { 22 trans.Dispose(); 23 } 24 }