本文转自:http://www.cnblogs.com/tylerdonet/archive/2011/09/23/2186579.html

在这一个随笔中将介绍在package中如何使用事务来保证数据的完整性和一致性。在SSIS中有两种事务:    分布式事务处理事务(Distributed Transaction Coordinator Transactions):在task,package中使用单独一个或者多个事务处理    本地事务(Native Transaction):SQL Server引擎级别的事务,在一个连接中使用T-SQL中的事务

注意:在SQL Server联机丛书中MSDTC是这样定义的:Microsoft 分布式事务处理协调器 (MS DTC) 允许应用程序跨两个或多个 SQL Server 实例扩展事务。此外,该协调器还允许应用程序参与由符合 Open Group DTP XA 标准的事务管理器管理的事务。

在这里我们将用4个小的练习来学习SSIS中的事务,他们分别是:    单个的package:使用DTC建立一个事务    单个的package:使用DTC扩展多个事务    2个package:使用DTC建立一个事务

单个package:使用T-SQL中的事务,就是本地事务 在package中使用该事务需要设置package或者task的属性。如果动手做这些练习,会看到这些属性更加精确的解释,如下图1

图1

  

下面说明TransactionOption的属性值的具体含义:

Supported :支持的,如果在父任务中存在事务,该任务也将被添加到事务中来 Not  Supported: 不支持,如果在父任务中发起事务,该任务不会被添加到事务中 Required: 需要的,如果父任务中没有发起事务,该任务将会发起一个事物,如果父任务发起事务,则将自己添加到这个事务中去

  

  

单个package,单个事务

创建一个package,命名为SinglePackageSingleTransaction,在Control Flow中拖放3个Execute SQL Task,命名如图2:

图2

  

在数据库中我们可以看到只插入了一条数据,这没有疑问,如果想让这个表T1在下面的task出现错误的情况下不创建该如何设置呢?首先要告诉Package在开始之行的时候开启一个事务,点击空白处按下F4键设置package的TransactionOption属性,如图3:

图3

  

然后要告诉package中的task,为了防患未然,需要融入到这个事务中来,依次点击选中这些package按下F4键设置它们的TransactionOption属性,如图4

图4

  

注意:这里需要说明的是,它们默认的选项值就是Supporated,根本不需要我们动手设置,这里啰嗦地说明,只是为了更好的理解它的工作原理。 现在重新执行package,一个DTC事务将会开启,所有的task将被监视,因为最后一个task出现错误,整个package将会被回滚,T1表也不会被创建。可以通过查看Visual Studio的输出(View->Output)来查看信息:

SSIS package "OnePackageOneTracsaction.dtsx" starting.

Information: 0x4001100A at OnePackageOneTracsaction: Starting distributed transaction for this container.

Error: 0xC002F210 at Insert into value ERROR, Execute SQL Task: Executing the query "insert dbo.T1 values('A')" failed with the following error: "Conversion failed when converting the varchar value 'A' to data type int.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.

Task failed: Insert into value ERROR

Information: 0x4001100C at Insert into value ERROR: Aborting the current distributed transaction.

Warning: 0x80019002 at OnePackageOneTracsaction: SSIS Warning Code DTS_W_MAXIMUMERRORCOUNTREACHED.  The Execution method succeeded, but the number of errors raised (1) reached the maximum allowed (1); resulting in failure. This occurs when the number of errors reaches the number specified in MaximumErrorCount. Change the MaximumErrorCount or fix the errors.

Information: 0x4001100C at OnePackageOneTracsaction: Aborting the current distributed transaction.

SSIS package "OnePackageOneTracsaction.dtsx" finished: Failure.

  

  

单个package,多个事务 

第2个联系我们来在单个package中同时开启两个事务。如图5,创建一个package命名为SinglePackageMultipleTransactions.dtsx。

图5

  

这个package中有两个SequenceContainer,每个都有自己的task。在Start Tran1内开启事务,它的子任务将会添加到事务中。Start Tran2开启另外一个事务,它的子任务会被添加到事务中,但它的子任务故意出错。每个task里面的SQL语句和第1个例子一样。这里我们想开启事务之后,让其可以建立表,插入一条正确的数据。当我们有一些相互分离的子任务,将他们分类放在不同的SequenceContainer中,设置各自的事务,让它们互不干扰,这种方法会很有用。下面列出它们的TransactionOption设置。

任务/容器

TransactionOption设置

Package

Supported

Strat Tran1

Required

Create table

Supported

Insert into value

Supported

Start Tran2

Required

Insert into value ERROR

Supported

设置好这些值之后执行package,结果如图6,第一个Container成功了,第二个失败了。

图6

  

在数据库中我们看到,表T1被创建,一行数据被插入到表中。

  

  

2个package,1个事务

这个练习中我们将新建2个package,分别命名为Caller.dtsx和Called.dtsx。这里我们想使用一个事务包含这2个package。让Caller创建表,然后使用ExecutePackage调用另外一个package,Called,这个package自己也来创建一个表并插入数据。然后故意在Caller这个package中添加一个招致错误的task。我们想让这2个package都回滚,如图6是建好的Caller,图7显示Called。

图6

图7

  

下面是设置它们的TransactionOption值和SQL语句

Task/Container

TransactionOption value

SQL script

"Caller" Package

Required

CREATE TABLE "Caller"

Supported

if exists(select * from sys.objects where object_id=object_id(N'[dbo].[Caller]') and type in (N'U')) drop table [dbo].[Caller]

go

create table dbo.Caller(col1 int)

EXECUTE "Called" Package

Supported

Make Things Fail

Supported

insert dbo.Caller values('A')

"Called" Package

Supported

Created Table "Called"

Supported

if exists(select * from sys.objects where object_id=object_id(N'[dbo].[Called]') and type in (N'U')) drop table [dbo].[Called]

go

create table dbo.Called(col1 int)

Insert Some Rows

Supported

insert into Called values(1)

执行这个Caller,到第3个task的时候遇到错误,两个package都会回滚,看上去像是在执行一个package一样。因为Caller开启一个事务,Called也设置了Supported属性,它也被包含在这个事务中。 如果Caller的TransactionOption设置为NotSupported,它会创建自己的表Caller并插入数据。   

  

 单个package,本地Sql Server事务

这个练习和上面的3个都不一样,它不再使用MSDTC来管理事务,而是使用SQL Server中的事务处理。这里演示怎样使用SQL Server自带的事务来从错误中回滚,但是这里的事务只能使用SQL Server数据库,如果连接其他数据库就不能工作了。创建一个package,命名为SinglePackageUsingNativeTracsaction.dtsx,如图8创建拖放3个task。下面给出这3个task的SQLStatement属性

Task

SQLStatement Property Value

BEGIN TRANSACTION

BEGIN TRANSACTION

CREATE TABLE Transactions

CREATE TABLE dbo.Transactions(col1 int)

COMMIT

COMMIT TRANSACTION

要使三个task使用同一个transaction必须保证他们使用同一个数据连接,设置它们所使用的连接的RetainSameConnection为true,如图8

图8

  

要使三个task使用同一个transaction必须保证他们使用同一个数据连接,设置它们所使用的连接的RetainSameConnection为true,如图9

图9

从图中我们可以看到,SQL Server新建了事务,最后提交了该事务。

作者:Tyler Ning             出处:http://www.cnblogs.com/tylerdonet/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,

如有问题,可以通过以下邮箱地址williamningdong@gmail.com 联系我,非常感谢。

[转] SSIS可靠性和扩展性—事务的更多相关文章

  1. OpenStack 企业私有云的若干需求(6):大规模扩展性支持

    本系列会介绍OpenStack 企业私有云的几个需求: 自动扩展(Auto-scaling)支持 多租户和租户隔离 (multi-tenancy and tenancy isolation) 混合云( ...

  2. 深入NGINX:我们如何设计它的性能和扩展性

    为了更好地理解设计,你需要了解NGINX是如何工作的.NGINX之所以能在性能上如此优越,是由于其背后的设计.许多web服务器和应用服务器使用简单的线程的(threaded).或基于流程的 (proc ...

  3. Zend server最大化应用程序的性能、扩展性和可用性

    如果我有8个小时去砍到一棵树,我会花6个小时磨斧子”——林肯(美国总统) 你可以知道? 世界页面访问量的峰值超过7000万每分钟. CloudFare公司服务器问题,导致785000站点崩溃一小时. ...

  4. MySQL - 扩展性 3 负载均衡:眼花缭乱迷人眼

    负载均衡的基本思路很简单: 在一个服务器集群中尽可能地的平均负载量. 基于这个思路,我们通常的做法是在服务器前端设置一个负载均衡器.负载均衡器的作用是将请求的连接路由到最空闲的可用服务器上.如图 1, ...

  5. MySQL - 扩展性 1 概述:人多未必力量大

    我们应该接触过或者听说过数据库的性能瓶颈问题.对于一个单机应用而言,提升数据库性能的最快路径就是氪金 - 买更高性能的数据库服务器,只要钱到位,性能不是问题. 但是当系统性能增加到一定地步时,你会发现 ...

  6. MySQL 复制 - 性能与扩展性的基石 1:概述及其原理

    1. 复制概述 MySQL 内置的复制功能是构建基于 MySQL 的大规模.高性能应用的基础,复制解决的基本问题是让一台服务器的数据与其他服务器保持同步. 接下来,我们将从复制概述及原理.复制的配置. ...

  7. 优秀开源项目之三:高性能、高并发、高扩展性和可读性的网络服务器架构State Threads

    译文在后面. State Threads for Internet Applications Introduction State Threads is an application library ...

  8. MySQL 复制 - 性能与扩展性的基石:概述及其原理

    原文:MySQL 复制 - 性能与扩展性的基石:概述及其原理 1. 复制概述 MySQL 内置的复制功能是构建基于 MySQL 的大规模.高性能应用的基础,复制解决的基本问题是让一台服务器的数据与其他 ...

  9. Atitit.兼具兼容性和扩展性的配置方案attilax总结

    Atitit.兼具兼容性和扩展性的配置方案attilax总结 文件配置法1 Jdbc多数据源文件配置发1 Bat文件配置法1 改进的文件配置法(采用类似i18n技术) 推荐1 使用自动化pc_id的方 ...

随机推荐

  1. leetcode 之Reverse Nodes in k-Group(22)

    这题有点繁琐,在更新指针时很容易出错. ListNode *reverseKGroup(ListNode *head, int k) { )return head; ListNode dummy(-) ...

  2. Letter Combinations of a Phone Number——简单的回溯算法

    Given a digit string, return all possible letter combinations that the number could represent. A map ...

  3. window 下 nginx+php+fastcgi 架设备忘

    1.配置Php.ini 1)extension_dir = "./ext" 修改这个路径为真实的php的ext路径 2);extension=php_mysql.dll ;exte ...

  4. EL表达式无法显示Model中的数据

    后台程序通过Debug都能正常返回数据并封装到Model中.而在前台通过EL表达式取值时却是原样输出,如${cart.num}... ///展现我的购物车 @RequestMapping(" ...

  5. keycloack docker 本地运行

    参考github地址:https://github.com/jboss-dockerfiles/keycloak 首先使用git 下载该项目 使用docker-compose运行项目,需要进入至doc ...

  6. python抓取网页图片的小案例

    1.分析 ,要抓取的页面的信息以及对应的源码信息 blog.sina.com.cn/s/blog 93dc666c0101b1bj.html 2.代码模块: 导入正则表达的模块 导入url相关的模块 ...

  7. 590. N叉树的后序遍历

    给定一个 N 叉树,返回其节点值的后序遍历. 例如,给定一个 3叉树 : 返回其后序遍历: [5,6,3,2,4,1]. 说明: 递归法很简单,你可以使用迭代法完成此题吗? /* // Definit ...

  8. 2. 创建一个简单的Maven项目

    ☞ 创建项目 选定一个目录,如E:\workspace\maven,新建的项目将放在这个目录. 运行CMD,切换到该目录. 执行mvn archetype:generate直到输出"Choo ...

  9. Did Pong Lie? (差分系统 判负环)

    Did Pong Lie? 时间限制: 5 Sec  内存限制: 128 MB提交: 68  解决: 15[提交][状态][讨论版] 题目描述 Doctor Pong has two arrays o ...

  10. ARP扫描工具arp-scan

    ARP扫描工具arp-scan   arp-scan是Kali Linux自带的一款ARP扫描工具.该工具可以进行单一目标扫描,也可以进行批量扫描.批量扫描的时候,用户可以通过CIDR.地址范围或者列 ...