开发者社区 问答 正文

SQL Server,远程存储过程和DTC事务

我们的组织在大型机Adabas数据库中拥有许多重要数据。我们可以对此数据进行ODBC访问,并且已经从C#使用ODBC /自然“存储过程”成功查询/更新了该数据。

我们现在想要做的是从SQL Server 2005存储的proc中查询大型机表,将结果转储到表变量中,对其进行按摩,然后将结果与本机SQL数据作为结果集进行连接。

当我们只是选择它时,从SQL执行Natural proc可以正常工作。但是,当我们将结果插入表变量中时,SQL似乎正在启动分布式事务,这反过来似乎对我们的连接造成了严重破坏。

鉴于我们不执行更新,是否可以关闭此DTC升级行为?

有关正确设置DTC以便与DataDirect(以前的Neon Systems)的Shadow ODBC驱动程序对话的任何提示?

展开
收起
心有灵_夕 2019-12-30 09:59:17 997 分享 版权
阿里云 AI 助理回答

在SQL Server中,当您尝试从一个数据库(如SQL Server)向另一个数据库(如Adabas大型机数据库)插入数据时,确实可能会触发分布式事务,尤其是当操作跨越了不同的数据源时。分布式事务协调器(DTC)正是用于管理这类跨系统的事务,确保事务的ACID属性(原子性、一致性、隔离性、持久性)。

要避免DTC自动升级并减少对连接的影响,您可以考虑以下几种策略:

  1. 使用中间层处理:最直接的方法是在应用程序层面(C#应用)处理数据,而不是直接在SQL Server存储过程中执行。这样,您可以先通过ODBC查询Adabas数据库,将数据读取到内存中(如DataTable或List等数据结构),然后在C#代码中处理这些数据,并最终通过ADO.NET或其他方式将处理后的数据插入到SQL Server表中。这种方法绕过了SQL Server中的分布式事务需求。

  2. 调整链接服务器配置:如果必须在SQL Server端处理,且您是通过链接服务器访问Adabas数据库,可以尝试调整链接服务器的属性来控制事务行为。例如,设置REMOTE_PROC_TRANSACTIONSOFF可能有助于阻止不必要的分布式事务启动。这可以通过T-SQL命令实现:

    EXEC sp_serveroption 'Your_Linked_Server_Name', 'remote proc transaction promotion', 'false'
    

    请替换Your_Linked_Server_Name为您的实际链接服务器名称。

  3. 修改事务隔离级别:在执行涉及外部数据源的操作时,尝试降低事务的隔离级别,比如使用READ UNCOMMITTED,但这需要权衡数据一致性的风险。

  4. 直接使用ADO.NET或ODBC API:在SQL Server存储过程中直接使用托管代码(CLR存储过程)或者通过外部程序调用ODBC API来执行数据移动逻辑,这样可以更精细地控制事务边界和提交行为。

  5. DTC配置优化:虽然这不是关闭DTC升级,但正确配置DTC以提高性能和稳定性也是重要的。确保DTC服务配置正确,网络防火墙允许必要的通信,并且DTC安全设置允许所需的服务账户进行交互。

请注意,上述建议可能需要根据您的具体环境和安全要求进行调整。在实施任何更改之前,建议在测试环境中充分验证,以确保不会影响数据的一致性和完整性。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答