SSIS事务

事务用于处理数据的一致性,事务的定义是,处于同一个事务中的操作是一个工作单元,要么全部执行成功,要么全部执行失败。

SSIS默认支持Task组件级别的事务,在默认情况下,单个Task组件在开始执行时,会打开连接,开启一个事务,等到Task组件执行完成,提交事务,关闭连接。

SSIS支持的事务

  • 单个Task组件的事务处理
    (最常用的Task组件是Execute SQL Task组件,在该组件中执行的TSQL脚本处于同一个事务中。在该Task组件执行时,打开连接,开启一个事务,直到所有的TSQL脚本都成功执行,组件执行成功;一旦该Task中的某个TSQL脚本执行失败,事务回滚,这意味着,该Task中的所有已经执行的TSQL脚本都将回滚。因此,在单个Execute SQL Task组件中执行大量的TSQL脚本,不是明智的选择,因为,这会导致日志文件的激增。)

  • 本机事务(多Task组件,单一连接,单一事务):是SQL Server引擎级别事务,通过TSQL事务命令管理的单一连接的事务处理;
    (让Package使用本机事务的关键是所有的任务组件都使用相同的连接管理器,并且连接管理器(Connection Manager)上的属性RetainSameConnection设置为True。如果连接管理器的属性RetainSameConnection值是False,那么每个Task组件在开始执行时,打开连接,在组件结束时,关闭连接。在组件执行结束时,如果存在未提交的事务,那么组件会自动回滚Task组件的TSQL查询语句。由于每个组件都会打开和关闭连接,即使两个组件,使用的是同一个连接管理器,它们使用的连接都是不同的。如果连接管理器的属性RetainSameConnection值是true,那么连接管理器会保持打开,直到Package结束,连接才会关闭。在连接关闭时,SSIS引擎会检查连接中是否存在未提交的事务,如果存在,执行事务回滚。)

  • 分布式事务(多Task组件,多连接,单一事务):通过分布式事务协调器(DTC,Distributed Transaction Coordinator) 实现跨连接,Task和Package的事务处理;
    (本机事务只能使用单一连接,在同一个连接中通过TSQL命令执行事务处理,不能实现跨连接,不能跨数据库的事务,由于SSIS经常需要处理多个数据库的数据,本机事务无法实现跨数据库的事务处理,用户可以通过MS DTC(微软分布式事务服务)实现分布式事务处理。)

在SSIS 引擎服务器上启用MS DTC服务,并在Package的Task组件上设置相应的TransactionOption,就能使用分布式事务。
每个可执行组件(Task或Container)都包含Transactions属性组,SSIS通过这两个属性实现事务处理:
IsoLationLevel:设置事务的隔离级别;
TransactionOption:设置事务选项;(选中task或者contain,点解F4打开属性)

  • Supported:如果已经存在一个事务,那么当前组件加入到事务中;
  • Not Supported:即使存在一个事务,当前组件也不会加入到事务中;
  • Requried:如果存在事务,那么当前组件加入到事务中;如果不存在事务,那么启动一个事务。

上图中,container设置位Supported,第一个task设置为Required,表示启动一个事务,第二个task设置为Supported,表示加入到task1的事务中。
第二个container是相同的设置。这两个container各自拥有一个单独的事务,互不影响。

下图是来源于http://blog.sina.com.cn/s/blog_72d3486f0102w2hh.html,
AA,BB,CC,DD都是插入语句操作,DD插入语句有个错误。

分布式事务报错

OLE DB provider "SQLNCLI11" for linked server "dbLink01" was unable to begin a distributed transac
如果分布式事务报错,可以尝试从以下几个方面进行解决。

  • 检查本地机器与目标机器的MSDTC(Distributed Transaction Coordinator)服务是否已经启用

  • MSDTC设置

  • 打开双方服务器,再打开SSMS,右击数据库服务器属性,在连接选项卡勾选"需要将分布式事务用于服务器到服务器的通信." 重启双方数据库服务。

  • 检查两台机器能够相互ping通Hostname。注意是机器名,而不是IP。
    (若不可以,进行如下设置:在目录“C:WindowsSystem32driversetc”下的hosts文件,写上IP和HostName的对应信息,如 “10.211.11.111 ABCD”。

  • 打开双方135端口
    MSDTC服务依赖于RPC(Remote Procedure Call (RPC))服务,RPC使用135端口,保证RPC服务启动,如果服务器有防火墙,保证135端口不被防火墙挡住。 使用“telnet IP 135 ”命令测试对方端口是否对外开放。也可用端口扫描软件(比如Advanced Port Scanner)扫描端口以判断端口是否开放

  • 允许msdtc服务通过防火墙,没有该选项时,通过点击【允许运行另一程序】按钮添加,位置为C:WindowsSystem32msdtc.exe。或者直接关闭防火墙也可以。

所有博客均为自己学习的笔记。如有错误敬请理解。
原文地址:https://www.cnblogs.com/tangtang-benben/p/15497260.html