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 ...
随机推荐
- selenium 处理浏览器多窗口
测试过程中,会弹出一些子窗口,并且有可能在多个窗口之间切换 必须要获取每个窗口的唯一标识符切换到该窗口,才能对该窗口的元素进行操作 首先,获取每个窗口的唯一标识符,然后以及和的形式返回 var mai ...
- Java笔记(十九)……多线程
概述 进程: 是一个正在执行中的程序 每一个进程执行都有一个执行顺序,该执行顺序是一个执行路径,或者叫一个控制单元 线程: 就是进程中的一个独立的控制单元,线程在控制着进程的执行 一个进程中至少有一个 ...
- HW3.18
import javax.swing.JOptionPane; public class Solution { public static void main(String[] args) { Str ...
- 浅谈js单例模式
单例模式就是在系统中保存一个实例,就是一个全局变量,在团队开发中,为了实现一些相似的功能,比如不同页面之间的表单验证,可能需求是不一样的,但是呢命名可能一样,这时就会产生冲突,这时候单例模式就能很好的 ...
- IBOutlet & IBAction
IBOutlet UILabel *label; 这个label在Interface Builder里被连接到一个UILabel.此时,这个label的retainCount为2. 所以,只要使用了I ...
- Oracle Tnsping慢
http://www.linuxidc.com/Linux/2014-02/96167.htm http://www.askmaclean.com/archives/dns%E8%AE%BE%E7%B ...
- Js/Jquery- Base64和UrlEncode编码解码
最近几天遇到一些URL参数明文显示的问题,因为是明文显示,容易让人通过改变参数查看到他没有权限看到内容. 一开始我的做法是自定义了规则,然后原始的那种URL编码.可是URL编译后效果不理想,他无法编译 ...
- 为什么在Windows有两个临时文件夹的环境变量Temp和Tmp?
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:为什么在Windows有两个临时文件夹的环境变量Temp和Tmp?.
- IOS 10适配https 包含对于一些http的一些兼容配置
iOS10 从2017年1月1日起苹果提出所有新提交的App默认不允许使用NSAllowsArbitraryLoads来绕过ATS的限制,也就是说强制我们用HTTPS,如果不这样的话提交App可能会被 ...
- 深入浅出Android动态载入jar包技术
在实际项目中.因为某些业务频繁变更而导致频繁升级client的弊病会造成较差的用户体验,而这也恰是Web App的优势,于是便衍生了一种思路.将核心的易于变更的业务封装在jar包里然后通过网络下载下来 ...