0
点赞
收藏
分享

微信扫一扫

将不确定变为确定~transactionscope何时提升为分布式事务?

​​回到目录​​

相关文章

​​将不确定变为确定~transactionscope何时提升为分布式事务​​

​​将不确定变为确定~transactionscope何时提升为分布式事务~续​​      

​​将不确定变为确定~transactionscope何时提升为分布式事务~再续(避免引起不必要的MSDTC)​​

 

       对于frameworks的TransactionScope大家应该都很熟悉了,它是一个分布式事务的语句块,被包含起来的语句可以一起被提交,当出现异常后,统一进行回滚,这一切都是托管的。

当WEB服务器没有开启MSDTC服务时,会出现这个提示:

将不确定变为确定~transactionscope何时提升为分布式事务?_数据

对于servers.msc中的MSDTC服务,它经常性的被挂掉

将不确定变为确定~transactionscope何时提升为分布式事务?_分布式事务_02

注意一下:如果你的msdtc服务挂了,当下一次WWW程序需要用到它时,它会自由重启。

将不确定变为确定~transactionscope何时提升为分布式事务?_数据_03

而对于你的事务块,如果这个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 }

这时,你的程序由于服务器MSDTC的问题,整个流程被“走不通”,其时这是正常的,事务的作用就是为了保持“数据的完整性”,如果你把语句块写在同一事务中,那说明他们应该是同进同退的,这是一个理论的问题。

而我在之前看过​​老赵​​​写过​​一个博文提到这个类似问题​​,看数据上下文的共享性会影响到事务被提升到MSTDC,我的测试告诉我,没有实现这个结果,这里希望老赵给出一个答案吧,呵呵!在这里先谢谢赵老大了!

 ​​回到目录​​


举报

相关推荐

0 条评论