SSIS:截断表语句导致表上的 LCK_M_SCH_S 锁定

问题描述 投票:0回答:2

我有一个 SSIS 包,其中包含 Begin 和 Commit/Rollback 事务块中的 2 个主要块 1. truncate table(使用truncate table查询) 2.导入数据(从平面文件导入数据并插入到这些截断的表中)

当我运行包时,作业被挂起。活动监视器显示创建了一个 LCK_M_SCH_S 锁,该锁会阻止进一步执行。

有时这有效,有时则无效。 要补充的是,如果我单独截断这些表并运行删除截断块的包,它执行得很好。 Activity Monitor on Lock

还要补充一点,导入数据组件不只有一个。我们有大约 6 个导入数据组件用于 6 个不同的表。目前我在屏幕截图中只保留了一张

Control flow

Data flow for Import Data component

sql-server ssis deadlock locks
2个回答
1
投票

查看您的屏幕截图,我要验证的第一件事是 OLE DB 连接管理器上的属性 RetainSameConnection 设置为 true(右键单击 CM,选择属性,找到 RetainSameConnection)。默认值为 False。

如果问题得到解决,那么根本原因是您在不同的事务中有两个请求试图修改同一资源。

如果您已经将连接管理器的属性切换为 true,那么我的下一个猜测是您希望将数据流“导入数据”的 DelayValidation 属性设置为 True。

如果问题得到解决,则根本原因是组件试图验证目标表的元数据,但被 truncate 语句阻止(反之亦然)。设置 DelayValidation 将阻止包验证该特定任务,直到最后一秒 - 给其他进程时间让路。这似乎不太可能,但这是程序包阻塞自身的唯一机会。


0
投票

对于仍然在“sys.sp_describe_first_result_set;1”引起的阻塞问题上发现这个有用的旧线程的人们。我通过将 ValidateExternalMetadata 设置为 False 来修复我的包

© www.soinside.com 2019 - 2024. All rights reserved.