EF的TransactionScope
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的更多相关文章
- EF架构~TransactionScope与SaveChanges的关系
		回到目录 TransactionScope是.net环境下的事务,可以提升为分布式事务,这些知识早在很久前就已经说过了,今天不再说它,今天主要谈谈Savechanges()这个方法在Transacti ... 
- EF 多线程TransactionScope事务异常"事务EFTransaction类定义:与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。"
		解决方案代码一:使用lock锁定 //对于锁推荐使用静态私有静态变量 private readonly static object _MyLock = new object(); /// <su ... 
- %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 ... 
- 第七节: EF的三种事务的应用场景和各自注意的问题(SaveChanges、DBContextTransaction、TransactionScope)
		一. 什么是事务 我们通俗的理解事务就是一系列操作要么全部成功.要么全部失败(不可能存在部分成功,部分失败的情况). 举一个事务在我们日常生活中的经典例子:两张银行卡(甲.乙),甲向乙转钱,整个过程需 ... 
- 第五节:EF Core中的三类事务(SaveChanges、DbContextTransaction、TransactionScope)
		一. 说明 EF版本的事务介绍详见: 第七节: EF的三种事务的应用场景和各自注意的问题(SaveChanges.DBContextTransaction.TransactionScope). 本节主 ... 
- EF中关于TransactionScope的使用
		前提条件 TransactionScope类需要引用System.Transactions; 数据库环境及需求 现在假设有两个表如图: ... 
- EF上下文对象线程内唯一性与优化
		在一次请求中,即一个线程内,若是用到EF数据上下文对象,就创建一个,这也加是很多人的代码中习惯在使用上下文对象时,习惯将对象建立在using中,也是为了尽早释放上下文对象, 但是如果有一个业务逻辑调用 ... 
- EntityFramework与TransactionScope事务和并发控制
		最近在园子里看到一篇关于TransactionScope的文章,发现事务和并发控制是新接触Entity Framework和Transaction Scope的园友们不易理解的问题,遂组织此文跟大家共 ... 
- 分享我们项目中基于EF事务机制的架构
		写在前面: 1. 本文中单元测试用到的数据库,在执行测试之前,会被清空,即使用空数据库. 2. 本文中的单元测试都是正确通过的. 要理解EF的事务机制,首先要理解这2个类:TransactionSco ... 
随机推荐
- 生产环境下JAVA进程高CPU占用故障排查
			问题描述:生产环境下的某台tomcat7服务器,在刚发布时的时候一切都很正常,在运行一段时间后就出现CPU占用很高的问题,基本上是负载一天比一天高. 问题分析:1,程序属于CPU密集型,和开发沟通过, ... 
- GTK+系统中的对话框(GTK+dialogs)
			GTK+系统中的对话框(GTK+dialogs) GTK+系统中的对话框(GTK+ dialogs) 在接下来的章节中我们将着重介绍GTK+系统中的对话框. 对话框窗口是众多GUI应用程序中不可或缺的 ... 
- [codevs1557]热浪
			本题地址:http://www.luogu.org/problem/show?pid=1339 http://codevs.cn/problem/1557/ http://www.tyvj.cn/p/ ... 
- 【原】Docker
			Docker 最近Docker火的不行不行的,正好有时间,找点资料学习一下. 1.Docker是一个轻量级虚拟化技术,比虚拟机有更多优势,简易安装.更快的速度.服务集成与开发流程自动化.跨平台.可移植 ... 
- 【HTML】Beginner9:Form
			1.Form Collect data inputted by a user. Used as an interface for a web application,or send d ... 
- Java笔记(一)……概述
			一.Java是什么 Java是SUN(Stanford University Network,斯坦福大学网络公司)1995年推出的一门高级编程语言. 二.Java的发展简史 在20世纪90年代初,Su ... 
- 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程04:技能的输入与检测》
			4.技能的输入与检测 概述: 技能系统的用户体验,制约着玩家对整个游戏的体验.游戏角色的技能华丽度,连招的顺利过渡,以及逼真的打击感,都作为一款游戏的卖点吸引着玩家的注意.开发者在开发游戏初期,会根据 ... 
- storm核心组件
			Storm核心组件 了解 Storm 的核心组件对于理解 Storm 原理非常重要,下面介绍 Storm 的整体,然后介绍 Storm 的核心. Storm 集群由一个主节点和多个工作节点组成.主节点 ... 
- makeKeyAndVisible的功能
			makeKeyAndVisible的作用 [self.window makeKeyAndVisible] 由于iPhone是单窗口程序,所以也就只有这么一个Window对象,而且是UIWindow,不 ... 
- Struts2学习笔记1
			一.下载struts2.0.1 http://struts.apache.org/downloads.html,下载struts-2.0.1-all.zip,这个压缩包中包括了开发struts2所需 ... 
