我们的组织在大型机Adabas数据库中拥有许多重要数据。我们可以对此数据进行ODBC访问,并且已经从C#使用ODBC /自然“存储过程”成功查询/更新了该数据。
我们现在想要做的是从SQL Server 2005存储的proc中查询大型机表,将结果转储到表变量中,对其进行按摩,然后将结果与本机SQL数据作为结果集进行连接。
当我们只是选择它时,从SQL执行Natural proc可以正常工作。但是,当我们将结果插入表变量中时,SQL似乎正在启动分布式事务,这反过来似乎对我们的连接造成了严重破坏。
鉴于我们不执行更新,是否可以关闭此DTC升级行为?
有关正确设置DTC以便与DataDirect(以前的Neon Systems)的Shadow ODBC驱动程序对话的任何提示?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在SQL Server中,当您尝试从一个数据库(如SQL Server)向另一个数据库(如Adabas大型机数据库)插入数据时,确实可能会触发分布式事务,尤其是当操作跨越了不同的数据源时。分布式事务协调器(DTC)正是用于管理这类跨系统的事务,确保事务的ACID属性(原子性、一致性、隔离性、持久性)。
要避免DTC自动升级并减少对连接的影响,您可以考虑以下几种策略:
使用中间层处理:最直接的方法是在应用程序层面(C#应用)处理数据,而不是直接在SQL Server存储过程中执行。这样,您可以先通过ODBC查询Adabas数据库,将数据读取到内存中(如DataTable或List等数据结构),然后在C#代码中处理这些数据,并最终通过ADO.NET或其他方式将处理后的数据插入到SQL Server表中。这种方法绕过了SQL Server中的分布式事务需求。
调整链接服务器配置:如果必须在SQL Server端处理,且您是通过链接服务器访问Adabas数据库,可以尝试调整链接服务器的属性来控制事务行为。例如,设置REMOTE_PROC_TRANSACTIONS
为OFF
可能有助于阻止不必要的分布式事务启动。这可以通过T-SQL命令实现:
EXEC sp_serveroption 'Your_Linked_Server_Name', 'remote proc transaction promotion', 'false'
请替换Your_Linked_Server_Name
为您的实际链接服务器名称。
修改事务隔离级别:在执行涉及外部数据源的操作时,尝试降低事务的隔离级别,比如使用READ UNCOMMITTED,但这需要权衡数据一致性的风险。
直接使用ADO.NET或ODBC API:在SQL Server存储过程中直接使用托管代码(CLR存储过程)或者通过外部程序调用ODBC API来执行数据移动逻辑,这样可以更精细地控制事务边界和提交行为。
DTC配置优化:虽然这不是关闭DTC升级,但正确配置DTC以提高性能和稳定性也是重要的。确保DTC服务配置正确,网络防火墙允许必要的通信,并且DTC安全设置允许所需的服务账户进行交互。
请注意,上述建议可能需要根据您的具体环境和安全要求进行调整。在实施任何更改之前,建议在测试环境中充分验证,以确保不会影响数据的一致性和完整性。