TransactionScope是一个分布式事务的语句块,被包含起来的语句一起被提交,当出现异常,一起回滚,这都是托管的

当Web没有开启MSDTC服务时候会出现:

而对于你的事务块,如果这个MSDTC服务被挂了后,如果事务块包含夸库操作,它将会被自动提升为MSDTC分布式事务
这时你的整个代码块会中断,抛出异常

注意:什么时间会把你的Transactionscope提升为分布式事务?即要使用MSDTC?

1 当你的web服务器与数据库服务器在同台电脑上,对同一个库进行操作时候,它不会提升为分布式事务

2 web服务器与数据库服务器在同台电脑,对于同一个库,建立多个数据上下文时候,它不会提升为分布式事务

3 当web服务器与数据库服务器在同台电脑上,当操作两个库的表,这时候才会提升为分布式事务

4 当web服务器与数据库服务器不在同台电脑上,每次都会引发MSDTC错误

EF 什么时候会认为我们的TransactionScope是分布式的?
对于数据库多表操作来说:它何时是分布式?要看事务中的Connection会话的数量,如果是一次,会认为在操作一个数据库,肯定不会引入MSDTC,但如果是多个Connection会话,会认为在操作多张表,这时它属于分布式的范围,同时会引起MSDTC
为什么在项目中,对于操作同一个数据库的多张表,总会产生MSDTC?

因为对于LinqToSql或者EF等ORM来说,它们会提供一个SubmitChanges,作用是打开Connection,将操作内容提交到数据库,关闭Connection

因为一般都会对CURD进行封装,如果同时封装了SubmitChange,这时候系统会认为是一次完成的Connection,而进行第二个Insert等操作时候,这时会有两个Connection会话,而在Transaction范围内,对于多个Connection的理解就是多个库,所以系统会把它提升为分布式事务,开启用MSDTC去支持它,对于我们来说,不希望每个Transaction都产生MSDTC,
解决方法很简单:
将CURD进行重装,加个参数ISSubmit就可以:表示如果为false,不立即提交数据

例如:
/// <summary>
/// 插入操作
/// </summary>
/// <typeparam name="TEntity">实体类型</typeparam>
/// <param name="entity">实体</param>
/// <param name="isSubmit">是否同时提交到数据库,对于写在transactionscope里的多条语句,
/// 如果本语句不是最后一条,本值为false,即不立即提交到数据</param>
public void Insert<TEntity>(TEntity entity, bool isSubmit) where TEntity : class
{
if (entity is EntityBase)
(entity as EntityBase).OnInsertBefore();
//Logger.InfoLog("Create 表名:{0},内容:{1}", entity, ToJson(entity));
_db.Entry<TEntity>(entity);
_db.Set<TEntity>().Add(entity);
if (isSubmit)
this.SaveChanges();
if (entity is EntityBase)
(entity as EntityBase).OnInsertAfter();
}
对于具体的事务块,可能这样:
using (TransactionScope trans = new TransactionScope())
{
try
{
base.Insert<Product_Comment>(entity.Product_Comment, false);
base.Insert<Review>(entity.Review);
trans.Complete();
}
catch (Exception)
{

throw;
}
finally
{
trans.Dispose();
}

}

总结:对于Web服务器与数据库服务器不在一起电脑上,产生MSDTC的关键在于Connection会话的数量,一个会话表示操作一个数据库,这时不产生MSDTC,如果是多个会话,认为是操作多个数据库,所以会产生MSDTC的分布式的问题

EF的TransactionScope的更多相关文章

  1. EF架构~TransactionScope与SaveChanges的关系

    回到目录 TransactionScope是.net环境下的事务,可以提升为分布式事务,这些知识早在很久前就已经说过了,今天不再说它,今天主要谈谈Savechanges()这个方法在Transacti ...

  2. EF 多线程TransactionScope事务异常"事务EFTransaction类定义:与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。"

    解决方案代码一:使用lock锁定 //对于锁推荐使用静态私有静态变量 private readonly static object _MyLock = new object(); /// <su ...

  3. %E3%80%90%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E3%80%91

    "%3Cdiv%20class%3D%22htmledit_views%22%20id%3D%22content_views%22%3E%0A%20%20%20%20%20%20%20%20 ...

  4. 第七节: EF的三种事务的应用场景和各自注意的问题(SaveChanges、DBContextTransaction、TransactionScope)

    一. 什么是事务 我们通俗的理解事务就是一系列操作要么全部成功.要么全部失败(不可能存在部分成功,部分失败的情况). 举一个事务在我们日常生活中的经典例子:两张银行卡(甲.乙),甲向乙转钱,整个过程需 ...

  5. 第五节:EF Core中的三类事务(SaveChanges、DbContextTransaction、TransactionScope)

    一. 说明 EF版本的事务介绍详见: 第七节: EF的三种事务的应用场景和各自注意的问题(SaveChanges.DBContextTransaction.TransactionScope). 本节主 ...

  6. EF中关于TransactionScope的使用

    前提条件 TransactionScope类需要引用System.Transactions; 数据库环境及需求 现在假设有两个表如图:                                 ...

  7. EF上下文对象线程内唯一性与优化

    在一次请求中,即一个线程内,若是用到EF数据上下文对象,就创建一个,这也加是很多人的代码中习惯在使用上下文对象时,习惯将对象建立在using中,也是为了尽早释放上下文对象, 但是如果有一个业务逻辑调用 ...

  8. EntityFramework与TransactionScope事务和并发控制

    最近在园子里看到一篇关于TransactionScope的文章,发现事务和并发控制是新接触Entity Framework和Transaction Scope的园友们不易理解的问题,遂组织此文跟大家共 ...

  9. 分享我们项目中基于EF事务机制的架构

    写在前面: 1. 本文中单元测试用到的数据库,在执行测试之前,会被清空,即使用空数据库. 2. 本文中的单元测试都是正确通过的. 要理解EF的事务机制,首先要理解这2个类:TransactionSco ...

随机推荐

  1. C# VS2010中,用微软自带的System.Data.OracleClient来连接Oracle数据库

    由于微软在.Net框架4.0中已经决定撤销使用System.Data.OracleClient,造成在VS2010中无法连接Oracle数据库,但它还依旧存在于.Net架构中,我们可以通过自己引用 C ...

  2. 关于 Unity 中 ModelImporter.optimizeGameObjects

         ModelImporter.optimizeGameObjects 能够优化骨骼动画,将无用的骨骼合并,效率测试官方给出的数据差距比较大( Unity CJ 干货分享:全新的Unity移动游 ...

  3. 【HTML】Advanced5:Accessible Forms

    1.label <form> <label for="yourName">Your Name</label> <input name=&q ...

  4. 链表反转C实现(递归与循环)

    //逆转链表http://blog.163.com/lichunliang1988116@126/blog/static/26599443201282083655446/ #include<io ...

  5. codeforce 660D Number of Parallelograms

    题意:询问多少个矩形. 统计横纵坐标差,放进vector中 #include<cstdio> #include<cstring> #include<iostream> ...

  6. Linux中link,unlink,close,fclose详解

    每一个文件,都可以通过一个struct stat的结构体来获得文件信息,其中一个成员st_nlink代表文件的链接数.       当通过shell的touch命令或者在程序中open一个带有O_CR ...

  7. 最常用的Java库一览

    本文由 ImportNew - 邢 敏 翻译自 programcreek.欢迎加入翻译小组.转载请见文末要求. 写在前面: 1) 本文列出的名单是根据我自己的调查,并结合个人的经验.有可能是它们不恰恰 ...

  8. Laravle Introduction

    Where To Start Learning a new framework can be daunting, but it's also exciting. To smooth your tran ...

  9. [六]JFreeChart实践五之与Struts2整合

    1.Action,返回Chart package com.java1234.chart.bar; import java.awt.Color; import org.jfree.chart.Chart ...

  10. MongoDB--使用修改器修改文档

    可以使用修改器啦修改文档,比如增加.删除文档的键值.使用修改器首先要定位到某个文档, 然后再增加相应的修改选项,需要使用update语句 1.$inc修改器修改文档 > db.users.fin ...