在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 ...
随机推荐
- BZOJ 3832: [Poi2014]Rally
Sol 线段树+拓扑序. 先把图的拓扑序搞出来,然后统计从起点到该点最长链,从该点到终点的最长链,然后建个起点终点,这里跟网络流很像,把它统一到一个有起点的图中,这里也要注意下细节处理.S,T的一个边 ...
- sql server 2008笔记
sql server 2008开启远程访问数据库 1.以windows验证模式进入数据库管理器. 第二步:右击sa,选择属性: 在常规选项卡中,重新填写密码和确认密码(改成个好记的).把强制实施密码策 ...
- 阿里云ecs云服务器安装wdcp控制面板教程
以前就听说服务器非常的难,而且我也不懂代码,不懂英文,我怕自己学不会就买了一个月的.开始我都不知道啥样的服务器,还是我的一位哥们给我远程买的,他说这个镜像最稳定了. 服务器买好后我便开始研究,可是怎么 ...
- 【GoLang】GoLang 的流程与函数
003.GO流程与函数 1 概述 1.1 Go中流程控制分三大类:条件判断,循环控制和无条件跳转 2 流程 2.1 if 2.1.1 if条件判断语句中不需要括号 2.1.2 条件判断语句里面允许声明 ...
- DIV UL LI
<style type="text/css"> .productDetailTabNav{ width:960px;} .productDetailTabNav ul{ ...
- 【leetcode】Word Break II
Word Break II Given a string s and a dictionary of words dict, add spaces in s to construct a senten ...
- ios coredata 无任何错误提示crash
最近写程序是遇到了一种情况,对coredata 操作时,有一定几率crash,crash时无任何说明,断点调试后发现,fetch出的对象的属性竟然和数据库中的不同,不知道什么情况下导致了context ...
- c++ 调用外部程序exe-ShellExecuteEx
此方法最实用的调用exe. #include <ShellAPI.h> string file_path = s_run_dir+"\\ConsoleApplication1.e ...
- properties配置文件的读取和写入
/** * 类名:PropertiesUtil * 功能:提供对properties配置文件的读取和写入 * @author ChengTao */package com.xy.xyd.rest.bi ...
- SolrCloud的官方配置方式
前面写过生产过程中的SolrCloud集群配置,实际上官方给出的是免安装配置,启动时采用命令行参数的方式启动,这样相对简单,并且官方文档也给出了外部Zookeeper的配置,和前面说的基本一致,这个不 ...