没有 MSDTC - 仍然收到“与底层事务管理器的通信失败”消息
在我的项目中,我使用 Ado.Net 的 DbTransaction 对象来管理事务...那么为什么我收到 MSDTC 相关错误 - “与底层事务管理器的通信失败”。
这是我的代码。
DbTransaction trans = Connection.BeginTransaction();
//Code
if (successfull)
{
trans.Commit();
}
else
{
trans.RollBack();
}
In my project I am using Ado.Net's DbTransaction object to manage transaction... Then why I am getting MSDTC related error - "communication with underlying transaction manager failed".
Here is my code.
DbTransaction trans = Connection.BeginTransaction();
//Code
if (successfull)
{
trans.Commit();
}
else
{
trans.RollBack();
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
不幸的是,建立 MSDTC 确实很麻烦。然而,一旦你开始使用它,它就会工作得很漂亮。问题的出现只是因为每个人的网络设置都略有不同。
听起来您的 MSDTC 服务可能未在您的客户端计算机或服务器上启用。
以下是在 Windows 7 上启用它的指南: --> http://www.thereforesystems.com/turn-on-msdtc-windows -7/
您还需要在数据库服务器上启用它: --> http://support.microsoft.com/kb/817064
一种简单的方法来测试它是否无需联系服务器管理员的方法是在您的开发盒上设置两个不同的本地数据库。然后尝试在两个数据库连接之间维护事务。假设您正确配置了 msdtc,一切都应该正常工作。
最后一点是,您可以通过引用 System.Transactions 库并使用如下所示的事务代码来让您的生活变得更轻松:
请注意,不需要显式回滚。如果 using 语句内发生任何崩溃,或者如果您在点击 .Complete(); 之前退出 using 语句,您的事务将回滚。有关 TransactionScope 的更多信息,请参见此处:--> http://msdn.microsoft.com/en-us /library/ms172152(VS.90).aspx
Unfortunately, MSDTC can really be a bear to set up. Once you have it going, however, it works beautifully. The problems only come in because everyone's network setup is just a little bit different.
It sounds like your MSDTC service might not be enabled on your client machine or, perhaps, your server.
Here's a guide to enabling it on Windows 7: --> http://www.thereforesystems.com/turn-on-msdtc-windows-7/
You will also need to enable it on your DB server: --> http://support.microsoft.com/kb/817064
An easy way to test if it works without having to contact your server admins is to set up two different local databases on your dev box. Then try to maintain a transaction across both database connections. Assuming you configured msdtc correctly, everything should work fine.
One last point is that you could look into making your life a little bit easier by referencing the System.Transactions library and using your transaction code like this:
Note that no explicit rollback is required. If anything crashes inside the using statement, or if you exit the using statement before hitting .Complete();, your transaction will roll back. For more information on TransactionScope, see here: --> http://msdn.microsoft.com/en-us/library/ms172152(VS.90).aspx