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. 嵌入式linux中使用 DHCP功能描述

    嵌入式linux中使用 DHCP功能描述 busybox中udhcpc的默认script脚本地址为#define DEFAULT_SCRIPT   CONFIG_UDHCPC_DEFAULT_SCRI ...

  2. VS.NET2010水晶报表安装部署

    水晶报表VS2010版IDE安装标准版SAP Crystal Reports, version for Visual Studio 2010 - Standard: 下载地址: http://down ...

  3. NHibernate统一类封装代码

    NHibernate已经成为.net主流的ORM框架,当然,在开发中如果需要使用NHibernate的话,我们一般会对她进行一次封装,以便在项目中使用更方便,以及对NHibernate有一个全局的控制 ...

  4. jquery.cookie 使用文档,$.cookie() 文档教程, js 操作 cookie 教程文档。

    jquery.cookie 使用文档,$.cookie() 文档教程, js 操作 cookie 教程文档. jquery.cookie中的操作: jquery.cookie.js是一个基于jquer ...

  5. 【HTML】Intermediate4:Tables:rowspan and colspan

    1.</th> header cell As with td elements,these must be enclosed inside tr elements 2.</tr co ...

  6. Java笔记(十四)……抽象类与接口

    抽象类概念 抽象定义: 抽象就是从多个事物中将共性的,本质的内容抽取出来. 例如:狼和狗共性都是犬科,犬科就是抽象出来的概念. 抽象类: Java中可以定义没有方法体的方法,该方法的具体实现由子类完成 ...

  7. HW3.6

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  8. windows 7 中将“我的电脑”锁定到任务栏

    1.在桌面右击->新建->快捷方式 2.输入%SystemRoot%\explorer.exe /E,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}点击下 ...

  9. string,vector和array(C++ Primer读书笔记)

    string string是标准库类型,使用时需要包涵头文件,使用using声明. include <string> using std::string; 1.定义和初始化 string ...

  10. Yii 图片FTP批量上传 并生成缩略图

    图片批量上传,前台使用 uploadify.swf,这个就不介绍了.这里使用两个扩展,一个是FTP上传的扩展,还有一个是生成缩略图的扩展地址:http://www.yiiframework.com/e ...