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
Sql server SSIS事务中的表锁_Sql Server_Ssis_Transactions - Fatal编程技术网

Sql server SSIS事务中的表锁

Sql server SSIS事务中的表锁,sql-server,ssis,transactions,Sql Server,Ssis,Transactions,我有一个带有asOnError事件处理程序的SSIS包 在我的软件包(需要TransactionOption)下,我执行以下操作 使用for each循环从表SampleTable读取挂起状态记录(支持TransactionOption) 将该记录状态更新为“进行中” …其他声明 将该记录状态更新为“已完成”。结束 我有一个OnError事件处理程序。在事件处理程序下,我在SampleTable的同一条记录中将状态更新为failed,它将导致tableloack(在支持/不支持模式下)。实际上,

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

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

使用for each循环从表
SampleTable
读取挂起状态记录(支持TransactionOption)

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

…其他声明

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

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

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

解决方案-改变方法。错误处理程序不应尝试修改在主块中处理的相同数据。或者-将所有一体式任务包含在序列容器中,并添加下一个任务-设置记录错误状态,优先约束-失败(如图所示)。序列容器可以具有TransactionOption=组织事务所必需的


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

那么,您请求帮助的问题是什么?事务回滚清除所有更改,包括OnError错误处理程序的更改?@Ferdipux,我想保留错误处理程序的数据更改。现在,当我将同一个“SampleTable”记录状态列更新为“failed”(由于事务锁定)时,包被卡在事件处理程序上。我将包修改为“受支持”,将ForEachLoopContainer修改为“Required”,将EventHandler修改为“NotSupported”。但仍然存在问题。@AbdulRasheed,您是否在FEL上定义了EventHandler,而不是在包级别定义了EventHandler?是的,检查了FEL和包级别的错误处理程序。我必须在OnError‘NotSupported’中指定什么?@AbdulRasheed,在ErrorHandler开始工作之前FEL事务是否回滚?表似乎被锁定在未完成的事务中,OneError试图更新它。在ErrorHandler之前,FEL事务未回滚。但是,如果我从OneError中删除更新查询(status=failed),它将正常工作并回滚,不会出现任何问题。