【发布时间】:2018-07-02 03:34:45
【问题描述】:
在我的代码中有一些事务要处理:
using (var scope = new TransactionScope())
{
repo1.SaveSomething();
repo2.SaveAnythingElse();
scope.Complete();
}
在 repo1 和 repo2 函数内部,使用并处理它们创建自己的数据库上下文,事务就像魅力一样工作。
现在我添加另一个这样的代码,它开始抛出异常:
基础提供程序在打开时失败。 (EntityFramework) 网络 分布式事务管理器 (MSDTC) 的访问权限已被禁用。 请在安全配置中为网络访问启用 DTC MSDTC 使用组件服务管理工具。 (System.Transactions) 事务管理器已禁用其支持 用于远程/网络事务。
我读到,尽管有相同的 sql server 相同的 db,但在事务内部打开连接时 - 它需要 MSDTC 组件来处理它。我将代码更改为以下内容:
using (var scope = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions() { IsolationLevel = IsolationLevel.ReadCommitted }))
{
....
scope.Complete();
}
现在异常消失了。
我的问题:
- 为什么前面代码中使用的事务从不丢弃异常?
- 为什么新代码会删除它?
- 更改后为什么不再下降?
我认为简单的问题 :) 任何帮助将不胜感激!
【问题讨论】:
-
什么数据库?交易促进是依赖于提供者的行为。
-
MS-Sql 服务器,兼容级别 SQL Server 2012 (110)。
标签: c# entity-framework transactions distributed-transactions msdtc