使用 MS Access DB 几乎总是一件痛苦的事。真正痛苦的是,在使用 OLE-DB 连接访问 MS Access 文件时,您甚至不能在 SSIS 中使用分布式事务。即使您只是想阅读它!怎么回事?那是什么样的交易支持?那么有人可以告诉我在这种情况下如何使 SSIS 包具有事务性吗?使用正常的事务模式会导致The Acquire Connection manager failed with error code 0xC0202009
2 回答
我遇到过这样的场景(古老的 MySQL 实例和他们拒绝我们创建事务权限的 DB2),我发现一个有效的解决方案是在原始文件中缓存不支持事务的源,缓存连接经理或记录集目标。为了简单起见,原始文件将是我的“首选”,但根据组件要求可能需要其他文件。
包的一般外观如下: 事务设置为必需的包(或封闭容器)。这将创建一个包含可以登记的任务的事务。然后我创建一个明确选择退出事务的“启动器”容器(事务选项:不支持)。这就是我们想要访问不支持事务的资源的地方。默认事务选项 Supported 意味着如果有可用的事务,它将加入一个打开的事务。我将所有需要事务的任务放在支持的容器中。
在事务之外的数据流中,我转储到一个 RAW 文件。我使用在“正常”事务支持的源中使用的相同查询。
在使用缓存输出的数据流中,我使用了第一步中生成的文件,瞧,事务按预期在目的地工作,并且在不支持它的源上没有尝试任何事务。
您可以将RetainSameConnection
OLE DB 连接管理器上的属性设置为True
,例如在写入 SQL Server 时,如此处所示。这反过来使您能够BEGIN TRANSACTION
在一个执行 SQL 任务中编写一个,然后选择另一个COMMIT
或ROLLBACK
另一个。
但请注意:避免松散的结局,因为这会在并行运行任务时创建多个连接。你必须创建一个从 BEGIN TRAN 到 COMMIT 的链,否则它会失败。
请参阅http://www.morrenth.com/transaction-and-retainsameconnection-in-ssis-ole-db-connection-manager.aspx