sqlserver Distributed Transaction 分布式事务
在webapi+ef+sqlserver开发项目时,利用transcope实现应用层级的事务时,偶尔会报分布式事务错误,而且很而复现,特别蛋疼。现将自己的解决方法初步整理下。
分析原因:搭建repository+ef框架时,在repository crud中写了savechange,savechange自身包含事务功能。而代码中又用transcope里面嵌套几个使用repository方法的service时,会报分布式事务错误,我怀疑是事务嵌套引发的。
The underlying provider failed on EnlistTransaction.(ㄒoㄒ) 在 System.Data.Entity.Core.EntityClient.EntityConnection.EnlistTransaction(Transaction transaction)
在 System.Data.Entity.Core.Objects.ObjectContext.EnsureContextIsEnlistedInCurrentTransaction[T](Transaction currentTransaction, Func` openConnection, T defaultValue)
在 System.Data.Entity.Core.Objects.ObjectContext.EnsureConnection(Boolean shouldMonitorTransactions)
在 System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func` func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
在 System.Data.Entity.Core.Objects.ObjectQuery`.<>c__DisplayClass7.<GetResults>b__5()
在 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func` operation)
在 System.Data.Entity.Core.Objects.ObjectQuery`.GetResults(Nullable` forMergeOption)
在 System.Data.Entity.Core.Objects.ObjectQuery`.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0()
在 System.Data.Entity.Internal.LazyEnumerator`.MoveNext()
在 System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable` source)
参照stackoverflow https://stackoverflow.com/questions/16020270/the-underlying-provider-failed-on-enlisttransaction-cannot-access-a-disposed-ob
Also - is it possible you have got nested transaction scopes, and some inner scope is being rolled back (disposed without calling complete)
for some reason? Due to how transaction scopes work, that would immediately doom the outer transaction(s), rolling them back immediately. – Marc Gravell
解决方法一:调整代码架构,剔除transcope,在unitofwork中统一savechange,一次提交事务(需要保证一次请求中的service中使用的DbContext为一个,用autofac依赖注入即可实现)。而不是在repository中savechange.
解决方法二:将数据库服务器设置成支持分布式事务。(暂时不推荐,有些情况不是真正的分布式事务,是自个框架、代码问题)
https://bbs.csdn.net/topics/390682626/
# 在两台机器上开启MSDTC【管理工具---组件服务---我的电脑“属性”---MSDTC】
# 开启SQL SERVER的分布式事务支持【属性---连接----最下面的复选框】
#服务中的:Distributed Transaction Coordinator 设置自动开启
#服务中的数据库代理服务:SQL Server Agent (MSSQLSERVER) 设置自动开启
# 确保两台机器的135端口都开着【注意防火墙】
# 确保主机名可以PING通,并且对应的IP是正确的【PING得通,但IP不正确则配置一下host文
件】
#确保SQL SERVER 代理服务开启
#确定在进程中可以看到msdtc.exe进程如果看不到请在CMD下运行"net start msdtc"开启服务
后正常
sqlserver Distributed Transaction 分布式事务的更多相关文章
- SQLServer之创建分布式事务
分布式事务创建注意事项 指定一个由 Transact-SQL 分布式事务处理协调器 (MS DTC) 管理的 Microsoft 分布式事务的起点. 执行 BEGIN DISTRIBUTED TRAN ...
- 浅述Oracle分布式事务概念
着系统的复杂性不断增加,我们所面对的分布式系统渐渐增加.分布式文件系统.分布式消息队列系统等等层出不穷,在一些行业特别是互联网行业应用广泛.分布式数据库也是目前使用比较常用的分布式系统之一. 简单来说 ...
- SQLSERVER分布式事务使用实例
实例一 尊重原著作:本文参考自http://www.jb51.net/article/43540.htm --BEGIN DISTRIBUTED TRANSACTION [transactionnam ...
- oracle分布式事务总结-转载
基本概念 Local Coordinator:在分布事务中,必须参考其它节点上的数据才能完成自己这部分操作的站点. Global Coordinator:分布事务的发起者,负责协调这个分布事务. Co ...
- oracle分布式事务总结
基本概念 Local Coordinator:在分布事务中,必须参考其它节点上的数据才能完成自己这部分操作的站点. Global Coordinator:分布事务的发起者,负责协调这个分布事务. Co ...
- 全局事务/分布式事务 (Global Transaction/ A distributed transaction)之我见
这里参考的是Oracle对于XA的支持,其他的应该雷同吧... 1个分布式事务由多个行为在不同的数据库上执行,1个分布式事务的执行成功意味着相关数据库上的行为执行均成功.“XA协定”(http://w ...
- SqlServer & Windows 可更新订阅立即更新启用分布式事务协调器(MSDTC)
原文:SqlServer & Windows 可更新订阅立即更新启用分布式事务协调器(MSDTC) 在可更新订阅中,在订阅设置更新方法,将 "排队更新" 设置为 " ...
- WCF分布式开发步步为赢(12):WCF事务机制(Transaction)和分布式事务编程
今天我们继续学习WCF分布式开发步步为赢系列的12节:WCF事务机制(Transaction)和分布式事务编程.众所周知,应用系统开发过程中,事务是一个重要的概念.它是保证数据与服务可靠性的重要机制. ...
- sqlserver分布式事务
启动服务中的Distributed Transaction Coodinator后 创建链接服务器ender-pc\subx 设定连接服务器RPC OUT 以及RPC属性为True 实验一下代码 创建 ...
随机推荐
- ssm,dubbo框架搭建得配置文件
在建立了parent,common,manager(pojo,mapper,sercie,web)的maven工程后,开始导入添加配置文件: pojo,mapper 最终会打成jar包,service ...
- day 0313函数的初识
1.函数的定义: 定义:def 关键词开头,空格之后接函数名和圆括号(),还有最后一个‘:’ def是固定的,定义函数的关键字. 空格-是为了将关键字和函数名分开,必须有的. 函数名:只能包括字符串, ...
- Excel--数据透视图
原文:https://ke.qq.com/course/289406 1.数据源注意项 2. 3.选中数据源操作 任意选中数据源表格中的单元格(有值得单元格),插入数据透视表 默认数据源区域就是整个表 ...
- python面向对象的三大特性
一.继承 面向对象中的继承就是继承的类直接拥有被继承类的属性而不需要在自己的类体中重新再写一遍,其中被继承的类叫做父类.基类,继承的类叫做派生类.子类.在python3中如果不指定继承哪个类,默认就会 ...
- 安全需求-建模归类——By Me
漏洞与Bug并不等同,他们之间的关系基本可以描述为:大部分的Bug影响功能性,并不涉及安全性,也就不构成漏洞:大部分的漏洞来源于Bug,但并不是全部,它们之间只是有一个很大的交集.可以用如下这个图来展 ...
- MongoDB 用户管理
创建管理员账户: 1.登录 [root@MongoDB ~]# mongo 2.切换到admin数据库创建账户 > use admin switched to db admin 3.用户创建用户 ...
- 前端 HTML body标签相关内容 常用标签 列表标签 ul,ol,li
列表标签 ul,ol,li ul.ol.li标签 都属于块级标签,独占一行 网站页面上一些列表相关的内容比如说物品列表.人名列表等等都可以使用列表标签来展示.通常后面跟<li>标签一起用, ...
- 我想要得那块牌—记烟台大学第一届"ACM讲堂"
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/sr19930829/article/details/26812621 2014年 ...
- 20170927 Webservice发布指定账户进行访问
1. 搭建IIS 平台 于服务器A1 2.发布Webservice 到A1 我的问题在于(Webservice中方法中内容会对B1服务器的共享路径进行写入文件动作), 如何来控制网页使用特定的账户去访 ...
- what's the 场外交易
出自 MBA智库百科(https://wiki.mbalib.com/) 什么是场外交易 场外交易是指证券投资机构之间不通过股票交易所,而以电话.电传等方式相互进行的股票交易. ...