Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Transactions SSIS:无法在分布式事务中登记_Transactions_Ssis - Fatal编程技术网

Transactions SSIS:无法在分布式事务中登记

Transactions SSIS:无法在分布式事务中登记,transactions,ssis,Transactions,Ssis,我试图做的是使用SSI将一些信息从Oracle11DB(查询)复制到SQLServer2008(单表)。很明显我和交易有关。当我将事务选项保留为它们的默认值时,所有操作都执行得很好,但当将PackageTransaction属性设置为Required(或将某个数据流组件事务属性设置为Required)时,我会出现以下错误。因此,在尝试执行此DTSX脚本时,出现以下错误: Microsoft (R) SQL Server Execute Package Utility Version 10.0.2

我试图做的是使用SSI将一些信息从Oracle11DB(查询)复制到SQLServer2008(单表)。很明显我和交易有关。当我将事务选项保留为它们的默认值时,所有操作都执行得很好,但当将PackageTransaction属性设置为Required(或将某个数据流组件事务属性设置为Required)时,我会出现以下错误。因此,在尝试执行此DTSX脚本时,出现以下错误:

Microsoft (R) SQL Server Execute Package Utility
Version 10.0.2531.0 for 32-bit
Copyright (C) Microsoft Corp 1984-2005. All rights reserved.

Started:  11:38:02 §£
Info: 2013-01-16 11:38:02.45
   Code: 0x4001100A
   Source: issued_import 
   Description: Starting distributed transaction for this container.
End Info
Info: 2013-01-16 11:38:04.52
   Code: 0x4004300A
   Source: Data Flow Task 1 SSIS.Pipeline
   Description: Validation phase is beginning.
End Info
Info: 2013-01-16 11:38:05.01
   Code: 0x40043006
   Source: Data Flow Task 1 SSIS.Pipeline
   Description: Prepare for Execute phase is beginning.
End Info
Error: 2013-01-16 11:38:05.10
   Code: 0xC0047062
   Source: Data Flow Task 1 Source - Query [1]
   Description: System.InvalidOperationException: Unable to enlist in a distributed transaction
   at Oracle.DataAccess.Client.OracleConnection.EnlistTransaction(Transaction transaction)
   at Microsoft.SqlServer.Dts.Runtime.ManagedHelper.GetManagedConnection(String assemblyQualifiedName, String connStr, Object transaction)
   at Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSConnectionManager100.AcquireConnection(Object pTransaction)
   at Microsoft.SqlServer.Dts.Pipeline.DataReaderSourceAdapter.AcquireConnections(Object transaction)
   at Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostAcquireConnections(IDTSManagedComponentWrapper100 wrapper, Object transaction)
End Error
Error: 2013-01-16 11:38:05.10
   Code: 0xC004701A
   Source: Data Flow Task 1 SSIS.Pipeline
   Description: component "Source - Query" (1) failed the pre-execute phase and returned error code 0x80131509.
End Error
Info: 2013-01-16 11:38:05.10
   Code: 0x4004300B
   Source: Data Flow Task 1 SSIS.Pipeline
   Description: "component "SQL Server Destination" (102)" wrote 0 rows.
End Info
Info: 2013-01-16 11:38:05.10
   Code: 0x40043009
   Source: Data Flow Task 1 SSIS.Pipeline
   Description: Cleanup phase is beginning.
End Info
Info: 2013-01-16 11:38:05.10
   Code: 0x4001100C
   Source: Data Flow Task 1 
   Description: Aborting the current distributed transaction.
End Info
Info: 2013-01-16 11:38:05.10
   Code: 0x4001100C
   Source: issued_import 
   Description: Aborting the current distributed transaction.
End Info
DTExec: The package execution returned DTSER_FAILURE (1).
Started:  11:38:02 §£
Finished: 11:38:05 §£
Elapsed:  2.823 seconds

请注意,我对执行分布式事务不感兴趣-相关的服务正在SQL Server端运行,但我非常确定Oracle端对此没有采取任何措施,分布式事务可能会失败。如果是这样的话,还有什么其他方法来解决这个问题?要将我的数据流任务包装为开始/结束事务执行SQL块(如建议的)?

通过将默认事务类型从支持的
更改为必需的
,我对该过程的理解是,如果它完全在单个SQL Server上,SSIS引擎基本上将使用
BEGIN TRAN
来处理事务。如果涉及多台服务器,那么SSI将使用分布式事务协调器来处理向侦听器讲适当语言以使事务正常工作的问题

对于DB2,我们必须显式地向只想从事务中读取数据的帐户授予一些权限(在这里挥手,因为我不知道具体情况)。如果内存正常,MySQL源代码也会遇到类似的问题

我们想使用本机事务,因为我们是懒惰的程序员,但不想经历提交更改控制请求的麻烦,因为我们可能希望在事务下读取所有DB2数据,所以我们的解决方案是创建两个数据流任务。控制流保持支持状态。第一个任务在支持的事务选项下运行(NotRequired也可以运行)。此任务从主机系统查询数据并将其写入原始目标。RAW是一种二进制文件格式,SSI可以非常有效地使用,并且是类型安全的,等等。第二个数据流任务将事务设置为Required,并将RAW文件用作源,然后路由到目标表。由于事务对文件没有意义,因此这减轻了MSDTC与非SQL Server系统协作的需要,从而使我们的生活更加轻松


不过,这是有代价的,那就是磁盘。只要SSIS命中磁盘,您就输掉了游戏。磁盘IO会造成伤害,因此对于大容量(大容量取决于IO子系统、加载数据的SLA等),您将从源系统中读取数据,写入本地系统,读回数据,然后最终写入目标系统。SSIS试图通过在内存中执行大量操作来避免大量读写操作。我们的工作量如此之大,以至于这对我们的性能的影响不足以超过文书工作的麻烦,但只有您才能在性能测试后打电话。

+1感谢您的解释-这当然是一个可接受的解决方案-只要没有其他人提出更好的建议,我会接受它作为答案。:/就我而言,恐怕我不愿意使用磁盘i/O或其他中间解决方案,如在处理过程中出现错误时删除数据-我宁愿只使用MS SQL事务-即我只需要Oracle数据的特定快照,我只关心将快照传输到SQL Server端的过程的完整性—只有在传输中断时才会回滚—不必担心,我总是愿意被证明是错误的或听到更好的方法。我在SSIS竞技场的唯一优势是,我几乎踩到了他们提供的每一颗地雷