SSIS中的OLE DB命令无限期地持有表上的独占锁

SSIS中的OLE DB命令无限期地持有表上的独占锁,ssis,locking,Ssis,Locking,我正在使用SSI实现upsert操作 一般的包结构是 <Begin transaction> <read config values> <Data flow task> <commit transaction> 有没有办法修复这种锁定情况?OLEDB命令已知有问题。它一次执行一行,类似于游标。所以它很慢,特别是当你有大量的记录要处理的时候。我不能确切地说为什么会有锁定,但我想这是因为其他进程试图同时访问表 最好将数据流任务更改为以下内容:

我正在使用SSI实现upsert操作

一般的包结构是

<Begin transaction>

<read config values>

<Data flow task>

<commit transaction>

有没有办法修复这种锁定情况?

OLEDB命令已知有问题。它一次执行一行,类似于游标。所以它很慢,特别是当你有大量的记录要处理的时候。我不能确切地说为什么会有锁定,但我想这是因为其他进程试图同时访问表

最好将数据流任务更改为以下内容:

oledb光源

查找

没有与OLEDB目的地匹配的输出,直接添加目的地,不需要OLEDB命令在此处执行插入

将匹配的记录转移到目标数据库中的暂存表

在控制流中,使用execute sql任务和update语句执行更新:现在执行基于集合的更新。比原始配置更快


在SQLServerCentral上,将完成整个实现。请注意,它使用的是2005,您需要对到Suite2008的查找转换进行细微更改。

OLEDB命令已知有问题。它一次执行一行,类似于游标。所以它很慢,特别是当你有大量的记录要处理的时候。我不能确切地说为什么会有锁定,但我想这是因为其他进程试图同时访问表

最好将数据流任务更改为以下内容:

oledb光源

查找

没有与OLEDB目的地匹配的输出,直接添加目的地,不需要OLEDB命令在此处执行插入

将匹配的记录转移到目标数据库中的暂存表

在控制流中,使用execute sql任务和update语句执行更新:现在执行基于集合的更新。比原始配置更快


在SQLServerCentral上,将完成整个实现。请注意,它使用的是2005,您需要对到suite 2008的查找转换进行细微更改。

由于您要显式控制您的事务,您是否已将
RetainSameConnection
属性设置为true?否则,您将有两个以上的数据库连接到同一个资源,并在不同的事务上插入和更新同一个表,这将导致您遇到的行为。

由于您显式控制事务,您是否已将
RetainSameConnection
属性设置为true?否则,您将有两个以上的数据库连接到同一个资源,并在不同的事务上插入和更新同一个表,这将导致您遇到的行为。

与您的问题无关,但您使用OLE DB命令进行插入有何原因?与您的问题相关,您明确控制您的事务而不是遵从MSDTC有什么原因吗?@billinkc我尝试了DTC,但它给了我一个不同的错误(现在没有确切的错误,但类似于
E\u DTC\u CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER
),与您的问题无关,但是为什么要将upsert与select/if exists update/if not insert一起使用,而不是使用奇妙的
MERGE
命令呢?@DominicGulet在SSIS中可以使用MERGE命令吗?我的印象是,实现是有缺陷的。如果它是安全的,我当然更愿意使用它。
MERGE
使用起来非常安全,是的,它可以在SSIS中工作。我在具有类型2维度的BI/数据仓库环境中多次使用它。它比SCD组件快得多。这与您的问题无关,但是您使用OLE DB命令进行插入有什么原因吗?与您的问题相关,您明确控制您的事务而不是遵从MSDTC有什么原因吗?@billinkc我尝试了DTC,但它给了我一个不同的错误(现在没有确切的错误,但类似于
E\u DTC\u CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER
),与您的问题无关,但是为什么要将upsert与select/if exists update/if not insert一起使用,而不是使用奇妙的
MERGE
命令呢?@DominicGulet在SSIS中可以使用MERGE命令吗?我的印象是,实现是有缺陷的。如果它是安全的,我当然更愿意使用它。
MERGE
使用起来非常安全,是的,它可以在SSIS中工作。我在具有类型2维度的BI/数据仓库环境中多次使用它。它比SCD组件快得多。你说得对。我建议改变这一点,使用基于集合的方法。我建议将其更改为使用基于集合的方法。
RetainSameConnection
设置为true:(此外,我不明白为什么插入和更新需要表锁。行锁不够好吗?
RetainSameConnection
设置为true:(此外,我不明白为什么Insert和Update需要表锁。行锁还不够好吗?
<oledb Source>

<Lookup>

<matched output to Update using oledbcommand>

<No Match output to Insert using oledbcommand>
select * from master.sys.sysprocesses where blocked<>0 or spid in (select blocked from master.sys.sysprocesses where blocked <>0)