在处理SSIS包的数据ETL操作过程中,我们经常遇到的一个问题就是一系列步骤在运行的过程中,如果中间的一个步骤失败了,那么我们就需要清理前面已经运行过的步骤所产生的数据或者结果,这往往是一个很头疼的过程。那么在SSIS的Package中是否可以实现事务机制呢?

我们知道基于事务我们可以保证在一系列操作下的各个步骤,它们要么全部成功,要么全部失败。这里将介绍在SSIS的Package中一个比较简单的实现方法。

首先,建立一个测试表,这个表里会有一个自增的主键标识,然后分别有一个文本和数字类型的字段。脚本如下:

USE [DBTEST]

CREATE TABLE [dbo].[TBTest](

[id] [int] IDENTITY(1,1) NOT NULL,

[Title] [nvarchar](50) NULL,

[Amount] [decimal](18, 0) NULL,

CONSTRAINT [PK_TBTest] PRIMARY KEY CLUSTERED

(

[id] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

在SSIS下新建立一个Package,然后加入如下三个步骤:

首先将数据表中的数据清空,然后INSERT几条数据,最后尝试进行一个失败的更新。

在LOAD DATA步骤中,简单的手动插入几条数据。

数据源语句的查询。

然后在第三步更新数据的步骤中,我们尝试对主键进行更新,这里的目的主要就是要引发一个异常然后让后续介绍的事务进行回滚。

首先看一下直接运行的结果。

可以看到在第三步中触发的异常。

并且在表中可以看到,数据确实没有被回滚,还在表中。

接下来,我们开始尝试在这个Package中加入事务机制。

如上图,SSIS的这种模块化真的是非常好,相信大家一看这个图就立刻明白接下来要做什么了。

在BEGINTRAN模块中的代码:

BEGIN TRANSACTION;

在COMMITTRAN模块中的代码:

COMMIT TRANSACTION;

最后,在ROLL BACK模块中的代码:

ROLLBACK TRANSACTION;

然后,运行包。

发现在ROLL BACK模块中还是报错了,错误信息如下:

并且,事务没有回滚。在表中还是可以看到被INSERT的数据。

这里的关键在于,每一个模块默认利用SSIS里的数据源连接,都是重新开启一个新的连接,所以这样在一个新连接里的ROLLBACK没有前文,肯定是要失败的。

所以,这里需要关注SSIS包数据源连接的一个属性,就是RetainSameConnection,它默认为False,把它设置成True,就可以保证在一个包里调用的数据源连接都是同一个连接。

设置好这个属性之后,我们再来运行下包。

可以发现,当数据流在有异常被触发的时候,ROLL BACK模块成功的进行了回滚。

从表中发现,数据确实被回滚了。

其实实现数据回滚的方法也很多,这是利用SSIS自带功能的一个实现,他确实实现起来相对简单一些。这样可以避免包失败后,重新运行包导致前面的步骤被重复运行。园子里另外一个兄弟BI Work介绍的这篇文章利用Check Point来避免这种情况的发生。除此之外,也可以在设计Package的时候,在包的开头就设计好对可能影响到的数据的清理工作。总之实现的方法很多,在实际项目中完全可以根据实际的情况来决定使用哪一个方案。

另外,在SSIS中实际上也可以利用MSDTC,但是它实现起来多少有一定的门槛,如果你对MSDTC感兴趣可以参考园子里另外一个朋友对它的介绍

在SSIS包中的事务处理的更多相关文章

  1. 变量在SSIS包中的使用

    2010~2011年经常使用SSIS包采集加工数据,后来换了工作就很少使用.最近又开始用那玩意采集数据,努力回想之前是怎样操作的,网上各种找各种纠结.趁这次使用记录下日常操作步骤,以备以后不时之需. ...

  2. 在SSIS包中使用 Checkpoint从失败处重新启动包[转]

    使用SSIS做ETL的过程中会遇到各种各样的错误,对于一些大数据量的Job失败以后我们不希望重新运行,因为重新运行的时间开销是非常大的,我们只希望从失败的部分开始运行,这样可以省去很多的时间. SSI ...

  3. 在SSIS包中使用 Checkpoint从失败处重新启动包

    使用SSIS做ETL的过程中会遇到各种各样的错误,对于一些大数据量的Job失败以后我们不希望重新运行,因为重新运行的时间开销是非常大的,我们只希望从失败的部分开始运行,这样可以省去很多的时间. SSI ...

  4. 在 SSIS package 中使用FTP

    在ssis 包中使用FTP 实际上很简单, 直接拿一个FTP控制流(FTP 任务) ,配置一下FTP 服务器就可以了, 但是当我想在SQL Server Job 中使用这个功能时却报了个错(如下), ...

  5. SSIS从理论到实战,再到应用(3)----SSIS包的变量,约束,常用容器

    原文:SSIS从理论到实战,再到应用(3)----SSIS包的变量,约束,常用容器 上期回顾: SSIS从理论到实战,再到应用(2)----SSIS包的控制流   首先我们来看看包里面的变量 SSIS ...

  6. 图解:SQL Server SSIS包和job的部署攻略

    原文:图解:SQL Server SSIS包和job的部署攻略 以下将建立一个SQL Server SSIS包 然后在job中使用这个包,并将job部署到目标机器 1. 首先建立ssis包,使用sql ...

  7. [转]一步一步部署SSIS包图解教程

    本文就SQL统计分析SSIS包的部署进行一次详细的部署图解教程,Sql Server Integration Services 提供了非常简单的部署工具,利用这些工具可以方便地将包文件(*.dtsx) ...

  8. 一步一步部署SSIS包图解教程

    本文就SQL统计分析SSIS包的部署进行一次详细的部署图解教程,Sql Server Integration Services 提供了非常简单的部署工具,利用这些工具可以方便地将包文件(*.dtsx) ...

  9. dtexec命令执行SSIS包

    默认情况下,同时安装了 64 位和 32 位版本的 Integration Services 命令提示实用工具的 64 位计算机将在命令提示符处运行 32 位版本.运行 32 位版本的原因是:在 PA ...

随机推荐

  1. Google java style

    这里主要是记录关于java style的笔记. 1,Google的. 博客链接(中文):http://www.cnblogs.com/lanxuezaipiao/p/3534447.html. 官方链 ...

  2. 交叉编译inetutils并配置telnet服务

    inetutils集成了许多网络客户和服务程序,主要有,finger, ftp, ftpd, rcp, rexec, rlogin, rlogind, rsh, rshd, syslog,syslog ...

  3. ssh authentication魔鬼细节--.ssh文件夹权限

    换到7后出现莫名奇妙问题,ssh验证始终不起作用. 服务器 centos7#mkdir ~/.ssh centos7#touch ~/.ssh/authorized_keys centos7#chmo ...

  4. MySQL知识点链接

    1.使用ab进行压力测试详解                                         http://www.365mini.com/page/apache-benchmark. ...

  5. zabbix3.0报错记录

    一.问题描述 在zabbix_server添加变量时,出现了以下的报错,

  6. 一个很详细的web.xml讲解

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "- ...

  7. 调试WebService

    1.运行WebService的调用程序 2.浏览器中运行asmx,这一步是为了让w3wp.exe出现在下一步的列表中 3.“工具”或“调试”菜单-->附加到进程 (MS为什么把同一功能放在不同的 ...

  8. java入门 第一季4

    1.数组 1).声明数组 数据类型[]数组名; 数据类型 数组名[]; 2).分配空间 数组名=new 数据类型[数组长度]: 3).赋值 score[0]=98: 直接创建一个长度为4的数组 int ...

  9. SAP ALV OO 选择行打印

    &---------------------------------------------------------------------* *& Report  ZSDF001 * ...

  10. syslog-ng 学习心得与配置说明

    配置说明syslog-ng的主配置文件存放在:/etc/syslog-ng/syslog-ng.conf 一.基础 系统自带版本: 引用 # rpm -qa|grep syslog-ng syslog ...