事务pipe理器已经禁用了对远程/networking事务的支持
我正在使用SQL Server和ASP.NET。 我有以下function:
Using js = daoFactory.CreateJoinScope() Using tran = New Transactions.TransactionScope() '... tran.Complete() End Using End Using
但是,例外事务pipe理器已经禁用了对远程/networking事务的支持。 被抛出
JoinScope的描述:
Public Class JoinScope Implements IJoinScope Implements IDisposable '... End Class
我已经在另一个应用程序中以相同的环境工作,没有问题,但在这里我有这个问题。 我能做些什么来解决这个问题?
确保“分布式事务处理协调器”服务在数据库和客户端上运行。 另外请确保您检查“networkingDTC访问”,“允许远程客户端”,“允许入站/出站”和“启用TIP”。
为MS DTC事务启用networkingDTC访问
-
打开组件服务pipe理单元。
要打开组件服务,请单击开始。 在search框中键入dcomcnfg,然后按ENTER键。
-
展开控制台树以find您要为其启用networkingMS DTC访问的DTC(例如本地DTC)。
-
在“操作”菜单上,单击“属性”。
-
单击安全选项卡并进行以下更改:在安全设置,selectnetworkingDTC访问checkbox。
在事务pipe理器通信中,选中允许入站和允许出站checkbox。
我间歇性地处理了这个问题,我遵循了这里的指示,在其他地方也非常类似。 所有configuration都正确。
此页面: http : //sysadminwebsite.wordpress.com/2012/05/29/9/帮助我find问题。
基本上,我已经在两台服务器上重复MSDTC的CID。 HKEY_CLASSES_ROOT \ CID
请参阅: http : //msdn.microsoft.com/en-us/library/aa561924.aspx部分确保为MSDTC分配唯一的CID值
我正在使用虚拟服务器,我们的服务器团队喜欢为每个服务器使用相同的映像。 这是一个简单的修复,我们不需要重新启动。 但是DTC服务确实需要设置为自动启动,并且在重新安装之后确实需要启动。
来自另一个答案的评论:“确保你使用同一个打开的连接来处理事务中的所有数据库调用 – Magnus”(不知道如何链接注释)
我们的用户存储在与我在交易中使用的数据分开的数据库中。 打开数据库连接获取用户正在为我造成这个错误。 移动事务范围之外的其他数据库连接和用户查找修复了错误。
我有一个存储过程调用另一个存储过程在“链接服务器”。当我在ssms中执行它是好的,但是当我在应用程序(通过entity framework)调用它时,我得到了这个错误。 这篇文章帮助我和我使用了这个脚本:
EXEC sp_serveroption @server = 'LinkedServer IP or Name',@optname = 'remote proc transaction promotion', @optvalue = 'false' ;
有关更多详细信息,请参阅 : 链接服务器:合作伙伴事务pipe理器已禁用其对远程/networking事务的支持
如果其他人有同样的问题:
我有类似的错误发生。 事实上,我正在一个事务中包装几个SQL语句,其中一个在链接服务器上执行(在EXEC(…)AT服务器语句中的合并语句)。 我解决了这个问题,打开一个单独的连接到链接的服务器,封装在一个try … catch语句,然后放弃在原来的连接事务处理,以防止渔获。
在我的情况下,exception被引发,因为我试图在一个已经存在的连接的TransactionScope中创build一个新的连接实例:
例:
void someFunction() { using (var db = new DBContext(GetConnectionString())) { using (var transaction = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted })) { someOtherFunction(); // This function opens a new connection within this transaction, causing the exception. } } } void someOtherFunction() { using (var db = new DBContext(GetConnectionString())) { db.Whatever // <- Exception. } }