• 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](50NULL
    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-AS-BFor 容器AABBCCDD结果记录数结果记录
    RequiredSupportedSupportedSupportedSupportedSupportedSupported0 
    RequiredRequiredRequiredSupportedSupportedSupportedSupported0 
    RequiredRequired

    NotSupported

    SupportedSupportedSupportedSupportedAA、BB
    Required

    NotSupported

    RequiredSupportedSupportedSupportedSupported3AA、BB、CC
    SupportedRequiredRequiredSupportedSupportedSupportedSupported2AA、BB

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

     

       对于包 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,希望大家要注意。

     

  • 相关阅读:
    Leetcode 814. 二叉树剪枝
    Leetcode 104. 二叉树的最大深度
    Leetcode 617. 合并二叉树
    Leetcode 226. 翻转二叉树
    Leetcode 654.最大二叉树
    【Leetcode】413. Arithmetic Slices
    【Leetcode】128. Longest Consecutive Sequence
    【Leetcode】605. Can Place Flowers
    【Leetcode】647. Palindromic Substrings
    高可用架构
  • 原文地址:https://www.cnblogs.com/invinboy/p/1662989.html
Copyright © 2020-2023  润新知