在SSIS包中的事务处理
在处理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包中的事务处理的更多相关文章
- 变量在SSIS包中的使用
2010~2011年经常使用SSIS包采集加工数据,后来换了工作就很少使用.最近又开始用那玩意采集数据,努力回想之前是怎样操作的,网上各种找各种纠结.趁这次使用记录下日常操作步骤,以备以后不时之需. ...
- 在SSIS包中使用 Checkpoint从失败处重新启动包[转]
使用SSIS做ETL的过程中会遇到各种各样的错误,对于一些大数据量的Job失败以后我们不希望重新运行,因为重新运行的时间开销是非常大的,我们只希望从失败的部分开始运行,这样可以省去很多的时间. SSI ...
- 在SSIS包中使用 Checkpoint从失败处重新启动包
使用SSIS做ETL的过程中会遇到各种各样的错误,对于一些大数据量的Job失败以后我们不希望重新运行,因为重新运行的时间开销是非常大的,我们只希望从失败的部分开始运行,这样可以省去很多的时间. SSI ...
- 在 SSIS package 中使用FTP
在ssis 包中使用FTP 实际上很简单, 直接拿一个FTP控制流(FTP 任务) ,配置一下FTP 服务器就可以了, 但是当我想在SQL Server Job 中使用这个功能时却报了个错(如下), ...
- SSIS从理论到实战,再到应用(3)----SSIS包的变量,约束,常用容器
原文:SSIS从理论到实战,再到应用(3)----SSIS包的变量,约束,常用容器 上期回顾: SSIS从理论到实战,再到应用(2)----SSIS包的控制流 首先我们来看看包里面的变量 SSIS ...
- 图解:SQL Server SSIS包和job的部署攻略
原文:图解:SQL Server SSIS包和job的部署攻略 以下将建立一个SQL Server SSIS包 然后在job中使用这个包,并将job部署到目标机器 1. 首先建立ssis包,使用sql ...
- [转]一步一步部署SSIS包图解教程
本文就SQL统计分析SSIS包的部署进行一次详细的部署图解教程,Sql Server Integration Services 提供了非常简单的部署工具,利用这些工具可以方便地将包文件(*.dtsx) ...
- 一步一步部署SSIS包图解教程
本文就SQL统计分析SSIS包的部署进行一次详细的部署图解教程,Sql Server Integration Services 提供了非常简单的部署工具,利用这些工具可以方便地将包文件(*.dtsx) ...
- dtexec命令执行SSIS包
默认情况下,同时安装了 64 位和 32 位版本的 Integration Services 命令提示实用工具的 64 位计算机将在命令提示符处运行 32 位版本.运行 32 位版本的原因是:在 PA ...
随机推荐
- 表单验证神器——jquery.validate插件
jquery.validate.js插件应用举例,ajax方式提交数据. html代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...
- Python文件操作题
1.如何用Python删除一个文件 os.remove(filename)或者os.unlink(filename). 2.Python如何copy一个文件 shutil模块里有一个copyfile函 ...
- $_request,$post,$get的三者区别和特点
一.$_request与$_post.$_get的区别和特点 $_REQUEST[]具用$_POST[] $_GET[]的功能,但是$_REQUEST[]比较慢.通过post和get方法提交的所有数据 ...
- TLS 与 python thread local
TLS 先说TLS( Thread Local Storage),wiki上是这么解释的: Thread-local storage (TLS) is a computer programming m ...
- PHP使用curl替代file_get_contents
初学php的朋友们,很容易翻一个错误,在写采集程序或者调用api接口总会有线考虑到使用file_get_contents函数来或许内容,程序的访问量不大倒是没什么影响,但是访问量提升了那非常的悲剧了, ...
- stty命令使用
stty [ -a ] [ -g ] [ Options ] stty(set tty)命令用于显示和修改当前注册的终端的属性. UNIX系统为键盘的输入和终端的输出提供了重要的控制手段,可以通过 ...
- 【Nginx】nginx 代理 Haproxy 怎么设置?
由于Haproxy是通过 url 正则匹配 识别 的,nginx代理到 haproxy需要设置 proxy_set_header Host 为 haproxy的目标 url 直接上配置 upstrea ...
- IDEA 编译时报错 “未结束的字符串文字” “解析时已经达到文件结尾”
Information:Using javac 1.7.0_75 to compile java sourcesInformation:java: Errors occurred while comp ...
- Unity3d运行时动态修改材质
void Start () { const string MainTexVariableName = "_MainTex"; var renders = gameObject.Ge ...
- 在linux环境编译boost
1.在boost官网:http://www.boost.org/下载相应版本的boost 2.解压boost到相应目录,在boost跟目录下有b2可执行程序,可以通过输入命令“/b2 --help”, ...