我正在尝试针对我的Sql 2000数据库为Linq-to-Sql操作设置一个简单的事务。使用TransactionScope看起来像这样:
using (TransactionScope transaction = new TransactionScope())
{
try
{
Store.DBDataContext dc = new Store.DBDataContext();
Store.Product product = GetProduct("foo");
dc.InsertOnSubmit(product);
dc.SubmitChanges();
transaction.Complete();
}
catch (Exception ex)
{
throw ex;
}
}
但是,我不断收到以下错误:
合作伙伴事务管理器已禁用其对远程/网络事务的支持。 (HRESULT异常:0x8004D025)
但是,如果我使用传统交易设置交易,它可以正常工作。所以这很好用:
Store.DBDataContext dc = new Store.DBDataContext();
try
{
dc.Connection.Open();
dc.Transaction = dc.Connection.BeginTransaction();
Store.Product product = GetProduct("foo");
dc.InsertOnSubmit(product);
dc.SubmitChanges();
dc.Transaction.Commit();
}
catch (Exception ex)
{
dc.Transaction.Rollback();
throw ex;
}
finally
{
dc.Connection.Close();
dc.Transaction = null;
}
我想知道TransactionScope是否正在做一些与我的第二次实现不同的事情。如果没有,我没有使用TransactionScope失去了什么?此外,任何导致错误的指导都会很好。我已经确认MSDTC在sql server和我的客户机上运行。
答案 0 :(得分:6)
看看这里:
使用System.Transactions和Microsoft SQL Server 2000进行快速交易 http://blogs.msdn.com/florinlazar/archive/2005/09/29/475546.aspx
在这里:
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=230390&SiteID=1
首先验证“分发事务协调器”服务是否为 在数据库服务器计算机和客户端计算机上运行
1.转到“管理工具>服务”
2.如果未运行,请启用“分发事务处理协调器”服务如果它正在运行且客户端应用程序与其不在同一台计算机上 数据库服务器,在运行数据库服务器的计算机上 1.转到“管理工具>组件服务”
2.在左侧导航树中,转到“组件服务>计算机>我的电脑”(您可能需要双击并等待某些节点 需要时间扩大)
3.右键单击“我的电脑”,选择“属性”
4.选择“MSDTC”选项卡
5.单击“安全配置”
6.确保选中“网络DTC访问”,“允许远程客户端”, “允许入站/出站”,“启用提示”(某些选项可能不是 必要的,试着让你的配置) 7.服务将重新开始 8.但是如果它仍然不工作,你可能需要重新启动你的服务器 (这是让我疯狂的事情)在客户端计算机上使用相同的上述步骤打开 “安全配置”设置,请务必选中“网络DTC” 访问“,”允许入站/出站“选项,重新启动服务和计算机 如果有必要的话。
在SQL服务器服务管理器上,单击“服务”下拉列表,选择 “分发事务协调器”,它也应该运行 你的服务器电脑。
答案 1 :(得分:2)
在Kein Sirmons指出我的Florin Lazar帖子中的DatabaseTransactionAdapter实现似乎可以解决问题。这是我的代码:
Store.DBDataContext dc = new Store.DBDataContext();
using (TransactionScope transaction = new TransactionScope())
{
try
{
var dbAdapter = new DatabaseTransactionAdapter(dc.Connection);
dc.Connection.Open();
dbAdapter.Begin();
dc.Transaction = (SqlTransaction)dbAdapter.Transaction;
Store.Product product = GetProduct("foo");
dc.InsertOnSubmit(product);
dc.SubmitChanges();
transaction.Complete();
}
catch (Exception ex)
{
throw ex;
}
}
唯一让我感到不安的是我没有明确地关闭连接,即使它没有在'using'语句中声明。
但根据Florin Lazar的说法,这是故意的。
你也不能关闭 连接,因为连接 应该保持开放直到交易 完成后,发生在 “使用”声明结束。适配器 将取得连接的所有权 一生,并在完成后关闭它 用它。
答案 2 :(得分:1)
在Windows 2008或更高版本上启用此功能的步骤如下:
首先验证“分发事务协调器”服务是否为 在数据库服务器计算机和客户端计算机上运行
- 转到“管理工具>服务”
- 如果“分发交易协调员”服务未运行,请将其打开
醇>如果它正在运行且客户端应用程序与其不在同一台计算机上 数据库服务器,在运行数据库服务器的计算机上
- 转到“管理工具>组件服务”
- 在左侧导航树中,转到“组件服务>计算机>我的电脑>分布式事务处理协调器”(您可能需要双击并等待,因为某些节点需要时间来扩展)
- 右键点击“本地DTC”,选择“属性”
- 选择“安全”标签
- 确保选中“网络DTC访问”,“允许远程客户端”,“允许入站/出站”
- 服务将重启
- 但是如果它仍然无法工作,你可能需要重新启动你的服务器(这是让我疯狂的事情)
醇>在您的客户端计算机上使用 以上程序打开“安全配置”设置, 确保选中“网络DTC访问”,“允许入站/出站” 选项,如有必要,重启服务和计算机。
在SQL服务器上 服务经理,单击“服务”下拉列表,选择“分发 “事务协调器”,它也应该在您的服务器上运行 计算机。
答案 3 :(得分:0)
更多通知: - 服务器配置指南 启用网络COM +访问(Windows Server 2003) 开始==>控制面板==>添加或删除程序==>添加/删除Windows组件,选择Application Server,然后单击详细信息。单击“启用网络COM +访问”,然后单击“确定”。单击“下一步”,然后单击“完成” - 如果2个服务器之间有防火墙,则在此范围端口上打开/关闭两个服务器: 点击开始==>控制面板==>管理工具==>组件服务。展开组件服务,展开计算机,右键单击我的电脑,然后选择属性。 在“我的电脑属性”窗口中,单击“默认协议”选项卡,单击面向连接的TCP / IP并选择“属性”。在新窗口中,单击“添加”并键入新的DTC端口范围。 单击“确定”以应用这些更改。 必须重新启动服务器才能使新更改生效