SSIS事务中的表锁

时间:2019-04-24 10:33:47

标签: sql-server ssis transactions

我有一个带有OnError事件处理程序的SSIS程序包

在我的包裹下(需要TransactionOption),我需要执行以下操作

从表SampleTable读取未决状态记录,用于每个循环(支持TransactionOption)

将记录状态更新为“进行中”。

...其他声明...

将该记录状态更新为“已完成”。结束。

我有一个OnError事件处理程序。在事件处理程序下,我将在相同的SampleTable记录中将状态更新为失败,并且它会导致tableloack(在两种模式下/不支持模式下)。实际上,在这里,我试图回滚我在控制流和数据流级别下所做的所有更改,事件处理程序除外。 现在,当我将相同的“ SampleTable”记录状态列更新为“失败”(由于事务锁定)时,程序包就卡在了事件处理程序上。

1 个答案:

答案 0 :(得分:2)

问题原因-您正在尝试使用事务处理程序更改事务中的相同表和相同表记录。错误处理程序立即在错误任务之后被触发,它不等待任务完成和事务回滚。因此,您的表和该表中的行被锁定在事务范围内,并且事件处理程序尝试修改同一条记录; 事件处理程序完成后,交易才会中止。这是经典的僵局情况。

解决方案-更改您的方法。错误处理程序不应尝试修改在主块中处理的相同数据。要么-将所有合一任务封装在一个序列容器中,然后添加下一个任务-设置具有优先约束的记录错误状态-失败(如图所示)。序列容器可以具有 TransactionOption = Required 来组织事务。 Sample error task precedence

替代方法-您可以将错误处理程序与 TransactionOption = NotSupported 一起使用(不回滚),并将错误的记录ID和其他信息写入其他表中(以避免锁定)。然后,在打包任务流程的后面,处理此错误信息并更新记录状态。