0

我有一个使用 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_transactionsDMV 并没有看到任何打开的事务(如果我调试方法可以看到它,但是一旦方法完成,没有打开任何事务)

仅供参考:dbcontext对象与选择更新的对象不同,我也尝试添加db.SubmitChanges(),但它也不起作用。

任何建议都会有帮助谢谢

编辑:搜索过程内部没有事务控制,它由一个简单的 LINQ 语句调用:

var result = (from r in context.GET_DATA(parameter)
                          select new Object{
                             .....
                           }
              );
return result.ToList();
4

0 回答 0