SSIS 中的事务

与 SQL Server 类似,Integration Services 或 SSIS 也包含事务选项来维护数据完整性。SSIS 中有三种类型的事务选项,您可以在容器、任务等中使用它们。

以下是 SSIS 中可用的事务列表

  • 不支持:它不会启动新事务,也不会加入现有事务(父事务)。例如,如果您在父级别(包级别)指定事务为必需,而在子级别(任务或容器)指定为不支持。SSIS 事务将不适用于子级别。
  • 支持:它不会启动新事务,但会加入现有事务(如果有)。
  • 必需:如果存在现有事务,则会加入。否则,它将在 SSIS 包中启动新事务。

让我们通过一个实际示例来了解配置 SSIS 中事务的步骤。在开始解释 SSIS 事务之前,我先在 SQL Server 中创建一个表

Create a Table in Database

SSIS 中的事务示例

在本节中,我们将向您展示使用示例配置 SSIS 中事务的步骤。为此,请从 SSIS 工具栏中拖动两个执行 SQL 任务并将其拖放到控制流区域。

Execute SQL Task in Control Flow

将第一个任务重命名为 INSERTING DATA,将第二个任务重命名为 UPDATING DATA。

Transactions in SSIS 2

现在,双击第一个执行 SQL 任务将打开编辑器进行配置。我选择 OLE DB 连接作为连接,它连接到数据库。接下来,我们将使用 Direct Input 作为语句,因此请单击…按钮编写自定义命令。

Execute SQL Task Editor

请在此处编写语句。从下面的屏幕截图中可以看到,我们正在编写一个INSERT 语句,将四条记录插入到我们之前创建的表中。

INSERT INTO [dbo].[SSIS Transactions Example] (
       [FirstName], [LastName], [Education], [Occupation], [YearlyIncome], [Sales])
VALUES   ('Tutorial', 'Gateway', 'Education', 'Admin', 10000, 200)
	,('Imran', 'Khan', 'Degree', 'Skilled Professional', 15900, 100)
	,('Doe', 'Lara', 'Masters','Management', 15000, 60)
	,('Ramesh', 'Kumar', 'High School', 'Professional', 65000, 630)
Insert Statement Query

接下来,双击第二个执行 SQL 任务。这里我们也选择 OLE DB 连接作为连接类型,它连接到数据库。接下来,我们将使用 Direct Input 作为语句。因此,请单击…按钮。

Transactions Query 5

请在此处编写自定义语句。从以下屏幕截图中可以看到,我们正在编写一个UPDATE 语句,用于更新 ID 为 1 的员工的教育为 Masters。

UPDATE [dbo].[SSIS Transactions Example]
   SET [Education] = 'Masters'
WHERE [EmpID] = 1
Update Query

单击确定完成执行 SQL 任务的配置。让我们运行 SSIS 事务包。

Transactions in SSIS 7

让我们打开 Management Studio 查询窗口来预览数据。正如您所见,该包插入了四条记录,并使用 Masters 更新了第一条记录。

Transactions Table Output

配置 SSIS 中的事务

SQL Server Integration Service 允许我们将事务应用于包级别(主级别)、任务级别或容器级别。目前,我们将使用 SSIS 事务在包级别。为此,请转到包属性并查找 Transaction Option 属性。

默认情况下,Transaction Option 选择为 Supported。我将其保留为默认选项。

Set Transaction Option Supported

让我向您展示任务级别的 SSIS 事务选项。为此,请选择执行 SQL 任务,转到其属性,然后查找 Transaction Option 属性。

Transactions in SSIS 10

我将更改第二个执行 SQL 任务中的 Update 语句,以故意使任务失败。

UPDATE [dbo].[SSIS Transactions Example]
   SET   [EmpID] = 5 
        ,[Education] = 'Masters'
WHERE [EmpID] = 1
Update Statement

现在,让我运行 SSIS 事务包。

Transactions in SSIS 12

正如您所见,该包插入了四条记录,但第一条记录尚未更新为 Masters 的值。

Transactions Destination Table

如果我们希望在任务失败时回滚整个操作怎么办?我的意思是,如果 Update 语句失败,如何从表中删除插入的行?

为此,我们必须将包级别的 Transaction Option 从 Supported 更改为 Required。这意味着 Insert Data 任务和 Updates Data 任务都将处于 Required Transaction 选项下。

Transactions in SSIS 14

现在,让我运行 SSIS 事务包。

Transactions in SSIS 16

现在,让我向您展示该表。正如您所见,该包甚至没有插入一条记录。即使第一个任务是成功的。

Transactions Table Empty

让我向您展示,如果我将第一个执行 SQL 任务的 SSIS Transaction Option 从 Supported 更改为 Not Supported 会发生什么?

Transactions in SSIS 18

它将插入四条记录。尽管包级别(父级别)存在必需的事务,但子级别的 Not Supported 选项将删除事务。

Transactions Output

在使用 SSIS 事务时,有些人可能会遇到以下错误

错误:SSIS 运行时因错误 0x8004D01B“事务管理器不可用”而无法启动分布式事务。DTC 事务未能启动。这可能是因为 MSDTC 服务未运行。

如果是这种情况,请转到服务并启动分布式事务协调器服务。如果您找不到该服务,请转到 Microsoft 下载页面并下载 Microsoft 分布式事务协调器 (MSDTC) 管理包。

Start Distributed Transaction Coordinator service

评论已关闭。