SSIS Table 锁定事务

SSIS Table Locking on Transactions

我正在尝试使用 SSIS 将数据上传到 MSSQL 2016。

过程是:

我想做的是在任何失败的情况下回滚所有数据。首先,我尝试使用 TransactionOption=Required 但这会锁定目标表,直到 SSIS 序列完成。然后我尝试使用 SQL 任务来创建 BEGIN、ROLLBACK 和 COMMIT 事务,因为我读到这是一些人的首选,它不会锁定表。但是,我的桌子仍然被锁定。在序列完成之前,我无法 SELECT 涉及的表中的数据。

Transactions:
BEGIN TRANSACTION T1;
ROLLBACK TRANSACTION T1;
COMMIT TRANSACTION T1

我正在尝试做的事情是否可行?如果可行,最好的方法是什么?

设置 TransactionOption=Required 与发出 TSQL BEGIN TRAN 相同,只是您负责实现自己的 commit/roll 返回逻辑。 SSIS 可能会使用分布式事务处理协调器 DTC,或直接向您的 SQL 服务器实例发出 begin tran 语句。

如评论所示,SQL 服务器将尝试锁定整个 table 如果它倾倒了大量 (5k) 行。这是可取的,因为 SSIS 是一种高性能的 ETL 工具,我不想与其他进程很好地协同工作——我有大量数据要加载,而其他人都让开。

I am unable to SELECT data from the tables involved until the sequence has completed.

您可能在您的客户端中使用了 default isolation level - 对于 SSMS,它是读取提交的。也许您的应用程序可以处理 "dirty reads" 以及所有这意味着。

如果您无法处理脏读,请将您的数据暂存到另一个 table(使用您的数据流任务),完成后,使用执行 SQL 任务发出插入语句.我通常在这一点上有一个明确的 tablock 提示,因为我知道我正在加载大量数据并且我试图帮助引擎。暂存 table 方法的好处是它消除了网络流量作为持有 table 锁的时间超过最佳时间的一个因素。

TransactionOption 属性 存在于包级、容器级(例如 For Loop、Foreach Loop、Sequence 等),以及几乎任何控制流任务(例如 Execute SQL 任务、数据流任务等)。
TransactionOption 可以设置为以下之一:

  • 必需 - 如果事务存在则加入它否则开始一个新事务
  • 支持 - 如果存在交易则加入(这是默认设置)
  • NotSupported - 不加入现有交易

我认为您应该使用 TransactionOption=Supported 来解决这个特定问题。


当我从我的 DEV PC 使用 DTC 时,我已阅读我需要在远程 SQL 服务器上启用网络 DTC 访问。我做得对吗?启用此功能是否会对 MSSSQL 造成任何问题?

DTC