我有一个使用 Linq-to-SQL 检索和更新数据的简单应用程序。
在我的DataContext
我有一个称为GET_DATA
使用链接服务器从非 SQL Server 数据源读取数据的过程。我使用读取的数据来更新 SQL Server 上的一些表。
在 SQL Server 上更新数据的过程是这样完成(总结)的:
var db = new MyDBDataContext()
db.ExecuteCommand("Update table1 set field={0} where field={1}", value1, value2);
它工作得很好。
现在,问题来了:一个新的需求来更新 2 个表而不是一个,所以我决定添加一些事务控制:
using (var db = new MyDBDataContext())
using (var tran = new TransactionScope())
{
try
{
db.ExecuteCommand("Update table1 set field={0} where field={1}", value1, value2);
db.ExecuteCommand("Update table3 set field={0} where field={1}", value1, value2);
tran.Complete();
}
catch (Exception e)
{
tran.Dispose();
}
}
它再次正常工作,但在我更新数据后(无论过程失败还是成功),如果我尝试运行搜索过程,我会收到以下错误:
无法执行操作,因为链接服务器 \"LINKED_SERVER_NAME\" 的 OLE DB 提供程序 \"OraOLEDB.Oracle\" 无法开始分布式事务。"}
让它再次工作的唯一方法是右键单击 ASP.Net 开发服务器并关闭它。似乎它保持打开状态,但我检查了dm_tran_session_transactions
DMV 并没有看到任何打开的事务(如果我调试方法可以看到它,但是一旦方法完成,没有打开任何事务)
仅供参考:dbcontext
对象与选择更新的对象不同,我也尝试添加db.SubmitChanges()
,但它也不起作用。
任何建议都会有帮助谢谢
编辑:搜索过程内部没有事务控制,它由一个简单的 LINQ 语句调用:
var result = (from r in context.GET_DATA(parameter)
select new Object{
.....
}
);
return result.ToList();