在包级别和任务级别有一个带有Required
事务的 SSIS 包。Supported
包的主要部分是删除数据并插入新数据:
在这里,Delete块从六个表中删除所有内容,Parse块将六个文件加载到六个表中。
如果Delete使用delete from dbo.table
,则一切正常,但速度很慢。
但是如果使用Deletetruncate table dbo.table
来代替,删除不会花时间,但是当涉及到Parse
任务时包会被阻塞。只会坐在那里无所事事。
此时在服务器端,我可以看到一个 SSIS spid 被 spid 阻止-2
,这是“孤立的分布式事务”。看起来,用来表示截断连接。这个连接悬而未决,包裹被它放置的锁所阻挡。
如果我将唯一使用的 SQL Server 连接管理器切换到RetainSameConnection = True
,则包一旦进入Parse任务就会失败。任务向管理器请求连接,管理器响应
[SQL Server 目标 [471]] 错误:SSIS 错误代码 DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER。对连接管理器“连接管理器”的 AcquireConnection 方法调用失败,错误代码为 0xC001A004。在此之前可能会发布错误消息,其中包含有关 AcquireConnection 方法调用失败原因的更多信息。
有没有办法设置包以便它使用truncate
并且不会阻止自己?
delete
这是由于在预执行阶段访问数据库元数据的任务造成的阻塞。可以使用锁找到锁
sys.dm_tran_locks
,并且它具有-2
OP 创建的价值。使用 Profiler 可以找到更多详细信息。可以通过将
ValidateExternalMetadata
属性更改为FALSE
或使用DELETE
语句提到的 OP 来解决阻塞。参考:KB2253391