【问题标题】:SSIS Table Locking on Transactions事务上的 SSIS 表锁定
【发布时间】:2019-11-25 13:02:10
【问题描述】:

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

流程是:

如果出现任何故障,我想做的是回滚所有数据。首先我尝试使用TransactionOption=Required,但这会锁定目标表,直到 SSIS 序列完成。然后我尝试使用 SQL 任务来创建 BEGIN、ROLLBACK 和 COMMIT 事务,因为我读到这是某些人的首选,它不会锁定表。但是,我的桌子仍然被锁定。在序列完成之前,我无法从相关表中选择数据。

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

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

【问题讨论】:

  • 如果您更改/插入超过 5000 行,您可能会遇到“锁定升级”问题,然后 SQL 将锁定整个表。
  • 我以前从未见过手工制作的事务逻辑。使用 SSIS 内置的东西。我经常看到的是先使用 SSIS 将数据批量加载到保存表中,然后调用存储过程将新数据处理到目标位置。
  • 在数据流任务中,目标组件是否勾选了 tabblock 选项?这是 OLEDB 目标的默认设置。
  • @MarkWojciechowicz 不,唯一选中的选项是“检查约束”
  • @TDP 问题是我正在删除数据并通过多个任务插入数据,因此如果序列容器内的任何任务失败,我希望回滚所有 3 个任务

标签: sql-server ssis sql-server-2016 ssis-2012


【解决方案1】:

设置 TransactionOption=Required 与发出 TSQL BEGIN TRAN 相同,只是您负责实现自己的提交/回滚逻辑。 SSIS 可以使用分布式事务协调器、DTC 或直接向您的 SQL Server 实例发出 begin tran 语句。

正如 cmets 所指出的,如果 SQL Server 大量 (5k) 行倾倒,SQL Server 将尝试锁定整个表。这是可取的,因为 SSIS 是一种高性能 ETL 工具,我不想与其他进程很好地配合使用——我有大量数据要加载,而其他人都可以避开。

在序列完成之前,我无法从相关表中选择数据。

您很可能在您的客户端中使用default isolation level - 对于 SSMS,它已被读取提交。也许您的应用可以处理“脏读”以及所有这一切。

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

【讨论】:

  • 这些表目前只有 200 行或更少的行。我已将 TransactionOption 设置为 NotSupported,因为我希望构建自己的事务逻辑,因此它的工作方式类似于我在 SSMS 中执行的操作。如果我写的是 SSMS:开始事务 T1;从 Table1 中删除 从 Table2 中删除 我可以在提交 T1 或回滚之前运行以下查询。当我运行删除 SQL 任务是 SSIS 时,为什么这会有所不同?从表 1 中选择 * 从表 2 中选择 *
  • 当您插入数据时,总会涉及到一个事务——无论是显式的还是隐式的。在您的场景中,您是否在同一个显式事务中运行选择语句?
  • 抱歉,我刚刚注意到您附加的链接,我已阅读,现在这更有意义,谢谢。是的,在运行 SELECT 时,我在与 DELETE 相同的会话中执行了它,这就是它运行的原因。阅读您的文章后,我在另一个会话中再次尝试了 SELECT,这预示着与 SSIS 相同的结果。所以我现在明白 SSIS 正在做它应该做的事情。所以我的下一个问题是……我应该使用 DTC 还是我自己的交易方法,我怀疑是 DTC?由于数据很少(插入的行数不超过 200 行),我已经取消了临时表
【解决方案2】:

TransactionOption 属性存在于包级别、容器级别(例如 For 循环、Foreach 循环、序列等)以及几乎任何控制流任务(例如执行 SQL 任务、数据流任务等) .
TransactionOption 可以设置为以下之一:

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

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


【讨论】:

  • 我明白这一点,我最初在序列容器上将 TransactionOption 设置为必需,但问题是通过启用它会锁定所涉及的表,直到序列提交或回滚。这意味着该表上的报告将被暂停,直到序列完成。无论如何你都不能在不锁定表格的情况下做到这一点吗?
【解决方案3】:

从我的 DEV PC 使用 DTC 时,我已阅读我需要在远程 SQL 服务器上启用网络 DTC 访问。我做对了吗?启用此功能会导致 MSSSQL 出现任何问题吗?

DTC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 2016-03-22
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多