SSIS 学习(8)事务

2019-02-15 13:48

Integration Services 学习(8):事务

事务,在数据库开发与应用中,发挥了重要的作用,但在Integration Services 包开发过程中,我们还一直没有提到过这个概念,它是不是还是如此,能让各数据库兄弟和睦相处,团结一致,同进退、共存亡呢?

没错,哪里有DB活动,哪里就有Transaction 参与,SSIS包也不例外。 在Integration Services 包中,数据库事务有以下几方面的功能: (1)将几项任务的结果集收集到事务中,以确保数据一致的更新。 (2)确保对多台数据库服务器进行一致的更新。

(3)确保对不同种类数据库进行一致的更新,比如Ms Sql Server 、Oracle、MySql 等. (4)也可以在单个包中,执行几个相互独立的事务。 ......

看来Transaction 这东东,在SSIS包中,还功莫大焉。大家听起来,似乎是王婆卖瓜。下面我们来看一看,如何在SSIS包中启用Transaction ?

Integration Services 中的事务是基于容器的,包括包、For循环、Foreach 循环、序列容器等,如果容器启用了事务,默认情况下,该容器的子容器以及容器的组件对象,都自动继承父级或者祖先级容器的事务。在这些容器中,都有一个共同的属性TransactionOption,以表明该容器是否支持事务。如图:

Required:指示该容器启用一个事务,如果其父容器启用了事务,则自动联接该事务;相反,父容器没有启用事务,则该容器会启动自已的事务。

Supported:指示容器不启动事务,但是如果父容器启动了事务,它会自动联接该事务;相反,父容器没有启动事务,它不会启动自已的事务。

NotSupported:指示容器不启动事务,也不联接现有事务。也就是说即使父容器启动了事务,他不会联接该事务,也不会启动自已的事务。

下面我们用一个实例来说明在Integration services 开发,如何启动事务?

首先我们在数据库中建立一张表,通过设置各容器的不同属性,看看其中的数据会发生什么样的变化?

CREATE TABLE [dbo].[Test1](

[ID] [smallint] NULL, [str] [varchar](50) NULL ) ON [PRIMARY]

然后在Sql Server Business Intelligence Development Studio 中创建一个包,如图:

包中有四个SQL执行,它们执行的SQL命令如下:

INSERT INTO [Test1]([ID],[str]) SELECT 1,'AA' INSERT INTO [Test1]([ID],[str]) SELECT 2,'BB' INSERT INTO [Test1]([ID],[str]) SELECT 3,'CC' INSERT INTO [Test1]([ID],[str])

SELECT 'DD','DD' ――制造一个错误.

很明显,前三个SQL 任务会执行成功,第四个SQL任务会执行失败,各对象的TransactionOption 属性设置如下:

包:TransactionOption =Required;4个SQL任务的TransactionOption =Supported。 点击[Development],结果如下:

我们回到DB中去看一看表中的结果,

一条记录也没有,说明Transaction 起作用了,如果其它设置都不变,修改”任务AA”的属性TransactionOption =NotSupported,再次运行,就有一条记录了,如图:

上面是以包为容器,容器中四个SQL任务,它们对事务的响应情况。

下面,我们再看一看另一种情况:包中有两个序列容器,一个For 循环,四个SQL任务(执行的SQL命令不变),它们的关系如图所示:

通过测试,每一个对象 TransactionOption 值的不同的设置,其结果也炯异

S-A

S-B

For 容器

AA

BB

CC

DD

结果记

记录 录数 0 0 2AA、 BB 3 AA、

Required Supported Supported Required Required Required

SupportSupportSupportSupported ed ed ed SupportSupportSupportSupported

ed

ed

ed

NotSupportSupportSupportSupportSupport

Required Required

ed ed ed ed ed Required NotSupportRequired SupportSupportSupportSupport

ed ed ed ed ed BB、CC AA、BB

SupportSupportSupportSupportSupport

Required Required

ed ed ed ed ed

最后,我们再看一看在包嵌套的情况下,事物又怎么样了呢?如图所示:

2

对于包 A 和包 C,TransactionOption 设置为 Required。

对于包 B 和包 D 以及任务执行包 B、执行包 D 和执行包 F,TransactionOption 设置为 Supported。

对于包 E 以及任务执行包 C 和执行包 E,TransactionOption 设置为 NotSupported。 只有包 B、包 D 和包 F 可以从它们的父包继承事务。 包 B 和包 D 继承包 A 启动的事务。 包 F 继承包 C 启动的事务。 包 A 和包 C 控制它们自己的事务。 包 E 不使用事务。

通过上面的分析,SSIS中的事务是非常灵活的,其控制的粒度可粗可细,可以多个包共享一个事务,也可以一包共存多个事物,这就为我们的开发,带来非常大的灵活性,只要我们善加应用,将会发挥重大的作用。

最后有两点注意事项,特别提醒一下:

1、Integration Services 包中启用事务,如果包中的数据流任务,跨越多个服务器,或者是不同类型的数据库,则每台服务器中的MSDTC 分布式事务服务必须开启,否则将会出错。对于安装在Linux 或者 Unix 服务器的数据库,没有MSDTC服务,将会发生什么情况,我还没测试过,如果哪位朋友有经历过,请不吝赐教,在下先谢了。

2、说到事务,就离不开事务的隔离级别(IsolationLevel),SSIS对象中,也有这个属性,但是缺省值为Serializable, 这是一个要求比较高的隔离级别,如果使用不当,将会对系统性能产生比较大的影响。而在Sql Server 数据库中,缺省的隔离级别为:Read Commited,希望大家要注意。


SSIS 学习(8)事务.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:王万生组成原理实用教程作业答案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: