在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 分布式事务的更多相关文章

  1. SQLServer之创建分布式事务

    分布式事务创建注意事项 指定一个由 Transact-SQL 分布式事务处理协调器 (MS DTC) 管理的 Microsoft 分布式事务的起点. 执行 BEGIN DISTRIBUTED TRAN ...

  2. 浅述Oracle分布式事务概念

    着系统的复杂性不断增加,我们所面对的分布式系统渐渐增加.分布式文件系统.分布式消息队列系统等等层出不穷,在一些行业特别是互联网行业应用广泛.分布式数据库也是目前使用比较常用的分布式系统之一. 简单来说 ...

  3. SQLSERVER分布式事务使用实例

    实例一 尊重原著作:本文参考自http://www.jb51.net/article/43540.htm --BEGIN DISTRIBUTED TRANSACTION [transactionnam ...

  4. oracle分布式事务总结-转载

    基本概念 Local Coordinator:在分布事务中,必须参考其它节点上的数据才能完成自己这部分操作的站点. Global Coordinator:分布事务的发起者,负责协调这个分布事务. Co ...

  5. oracle分布式事务总结

    基本概念 Local Coordinator:在分布事务中,必须参考其它节点上的数据才能完成自己这部分操作的站点. Global Coordinator:分布事务的发起者,负责协调这个分布事务. Co ...

  6. 全局事务/分布式事务 (Global Transaction/ A distributed transaction)之我见

    这里参考的是Oracle对于XA的支持,其他的应该雷同吧... 1个分布式事务由多个行为在不同的数据库上执行,1个分布式事务的执行成功意味着相关数据库上的行为执行均成功.“XA协定”(http://w ...

  7. SqlServer & Windows 可更新订阅立即更新启用分布式事务协调器(MSDTC)

    原文:SqlServer & Windows 可更新订阅立即更新启用分布式事务协调器(MSDTC) 在可更新订阅中,在订阅设置更新方法,将 "排队更新" 设置为 " ...

  8. WCF分布式开发步步为赢(12):WCF事务机制(Transaction)和分布式事务编程

    今天我们继续学习WCF分布式开发步步为赢系列的12节:WCF事务机制(Transaction)和分布式事务编程.众所周知,应用系统开发过程中,事务是一个重要的概念.它是保证数据与服务可靠性的重要机制. ...

  9. sqlserver分布式事务

    启动服务中的Distributed Transaction Coodinator后 创建链接服务器ender-pc\subx 设定连接服务器RPC OUT 以及RPC属性为True 实验一下代码 创建 ...

随机推荐

  1. Flink - allowedLateness

    WindowOperator processElement final Collection<W> elementWindows = windowAssigner.assignWindow ...

  2. Flink – Stream Task执行过程

    Task.run if (invokable instanceof StatefulTask) { StatefulTask op = (StatefulTask) invokable; op.set ...

  3. WinAPI Hook

    1.抢先load 需要hook的dll,替换需要hook的函数的地址, 2.调用堆栈信息的获取: 3.内存信息的统计: 4.如何统计已经free掉的内存? 5.如何批量注入程序load的dll? IA ...

  4. Android抓包方法 之Fiddler代理

    1.抓包原理 Fiddler是类似代理服务器的形式工作,它能够记录所有你的电脑和互联网之间的http(S)通讯,可以查看.修改所有的“进出”的数据.使用代理地址:127.0.0.1, 默认端口:888 ...

  5. Linux I/O 调度器

    每个块设备或者块设备的分区,都对应有自身的请求队列,  而每个请求队列都可以选择一个I/O调度器来协调所递交的.I/O调度器的基本目的是将请求按照它们对应在块设备上的扇区号进行排列,以减少磁头的移动, ...

  6. kvc原理

    KVC底层实现原理 第一步:寻找该属性有没有setsetter方法?有,就直接赋值 第二步:寻找有没有该属性带下划线的成员属性?有,就直接赋值 第三步:寻找有没有该属性的成员属性?有,就直接赋值 1. ...

  7. what's the python之异常处理

    what's the 异常 python程序中会出现异常,即bug.若出现异常程序就报错,异常之后的代码就不会继续往下执行,这是一个正常程序不允许出现的,但是在某些程序交互的时候难免会因为用户输入问题 ...

  8. sed 操作命令

    sed介绍 grep 只能过滤文件内容,sed既能过滤文件内容同时还能对文件内容进行修改.  sed 算是一种编程语言,它有自己的固定语法. sed是一种行编辑器,sed会在内存中开辟一块独立的空间( ...

  9. ROS开发与常用命令

    初始化ROS的catkin工作空间:catkin_init_workspace 编译ROS的catkin工作空间:catkin_make 读取当前catkin工作空间的环境变量:source deve ...

  10. Spark之数据倾斜 --采样分而治之解决方案

    1 采样算法解决数据倾斜的思想 2 采样算法在spark数据倾斜中的具体操作