Package的Transaction处理之一:使用Connetion的属性RetainSameConnection

查看Connection的属性RetainSameConnection,默认值是False,即每一个task都会单独地使用这个连接,每个task都会单独的打开和关闭这个connection。将这个属性修改为true,所有的task都会使用同一个连接。

在循环任务中需要连接数据库时这个属性设置很重要,它将避免多次打开,关闭连接。只在package开始执行时,打开connection,package结束时,关闭connection,保证所有task使用的都是同一个connection。

实例1,利用sql 的begin/commit/rollback tran来实现事务的提交或回滚

package的control flow

创建示例表

create table dbo.dt_test
(id int)

exec sql statment 这个task的sql语句是

insert into dbo.dt_test
values(1)

insert into dbo.dt_test
values(‘a‘)

如果RetainSameConnection为false,那么执行时会报错

错误原因可以从Progess选项卡中查看

Task exec sql statment的错误原因,很明显,插入数据的数据类型不对

[Execute SQL Task] Error: Executing the query "insert into dbo.dt_test values(‘a‘)

insert into d..." 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 rollback的错误原因是:没有begin tran 子句,由于RetainSameConnection为false,每个task都是单独打开和关闭connection,所以在Task rollback中并没有begin tran 子句。

[Execute SQL Task] Error: Executing the query "rollback tran" failed with the following error: "The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.

将RetainSameConnection设置为true,使所有的task的connection都是相同的。再次执行,还是失败,错误原因是:

[Execute SQL Task] Error: Executing the query "rollback tran" failed with the following error: "The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.

大胆猜测是由于Execute SQL Task 在失败时,自动进行事务回滚。修改Package,增加一个Task Insert Statement,执行的sql 语句是:

insert into dbo.dt_test
values(0)

并在Exec sql statement task上增加breakpoint,在执行task之前触发断点。

重新执行package,在断点处,查看表dt_test,0插入到表中

继续执行,查看表dt_test,数据已经被回滚。

结论1:当Execute Sql task执行失败时,会自动进行事务的回滚,但是当Execute Sql task执行成功时,不会进行事务的提交,显示开启一个事务,需要显示进行提交。

结论2:当package执行结束时,package会将未提交的事务进行回滚。

修改exec sql statment,将执行的sql修改为正确的sql语句,那么将进行commit tran task将进行事务的提交。

insert into dbo.dt_test
values(1)

将commit tran task disable,package执行完成之后,package检测到有未提交的事务,package会将这些未提交的事务回滚。

结论3:当connection关闭时,package会将未提交的事务回滚。

将Connetion的属性RetainSameConnection设置为false,其回滚的scope是不同的。

修改begin tran task执行的sql语句,package执行将begin tran task的语句进行回滚,而不会回滚insert statement 和exec statement。

begin tran

insert into dbo.dt_test
values(3)

使用Connetion的属性RetainSameConnection进行事务处理有个明显的缺点,就是只能在同一个connection下,ssis经常需要处理多个数据库的数据,因此对于跨数据库的事务处理,这种方式是无能为力的,ssis自带的MSDTC(微软分布式事务服务)能够处理跨数据库事务。

时间: 2024-12-30 03:12:20

Package的Transaction处理之一:使用Connetion的属性RetainSameConnection的相关文章

在SSIS中的不同组件间使用局部临时表

Connetion的属性RetainSameConnection是个boolean值,指定是否保持相同的链接,默认值是false,表示每个component都会单独的使用connection,在component开始时打开connection,在component结束时关闭connection.不同的componet之间使用的是不同的connection. 由于局部临时表的生命周期是在当前连接,在链接关闭时就会终止,临时表就不存在了.在SSIS中不同组件间使用临时表,需要设置Connetion的

Spring Transaction属性之Propagation

Spring Transaction中有一个很重要的属性:Propagation.主要用来配置当前需要执行的方法,与当前是否有transaction之间的关系. 我晓得有点儿抽象,这也是为什么我想要写这篇博客的原因.看了后面的例子,大家应该就明白了. 一.Propagation取值: REQUIRED(默认值):在有transaction状态下执行:如当前没有transaction,则创建新的transaction: SUPPORTS:如当前有transaction,则在transaction状

【MySQL专辑】CentOS卸载MySQL的方法 yum remove xxx

[[email protected] lampp]# rpm -qa|grep mysql mysql-community-release-el6-5.noarch mysql-community-client-5.6.20-4.el6.i686 mysql-community-libs-5.6.20-4.el6.i686 mysql-community-common-5.6.20-4.el6.i686 mysql-community-server-5.6.20-4.el6.i686 [[ema

Overview of Flashback Technology

Oracle Flashback Query : SELECT AS OFOracle Flashback Version Query :DBMS_FLASHBACK PackageOracle Flashback Table:Oracle Flashback Drop:Oracle Flashback Database:http://docs.oracle.com/cd/B28359_01/backup.111/b28270/rcmflash.htm#i1018669 Oracle Flash

SSIS 事务处理

事务用于处理数据的一致性,处于同一个事务中的操作是一个工作单元,要么全部执行成功,要么全部执行失败.SSIS默认支持Task组件级别的事务.在默认情况下,单个Task组件在开始执行时,会打开连接,开启一个事务,等到Task组件执行完成,提交事务,关闭连接,也就是说,默认情况下,单个Task组件在单个事务中执行查询,因此,在单个Execute SQL Task组件中执行大量的TSQL脚本,不是明智的选择,因为,这会导致日志文件的激增.如果Task组件执行失败,SSIS引擎自动进行回滚Task级别上

好记性不如烂笔头25-JAVA处理数据库事务(3) - 事务回滚点

在具体的工作中,有的事情需要被保持,不需要回滚,有的工作需要回滚,而这些逻辑,可以通过手动设置事务的回滚点. 1.用JAVA处理数据库事务的事务回滚点的准备 要有一个能够访问数据库的应用.下面的示例都基于ORACLE进行. create table ffm_account( id int primary key , name varchar(32), money int ); 测试数据: insert into ffm_account(id,name,money)values(1,'A',100

RAD6.0+EJB+WEBSPHERE+JNDI转eclipse+TOMCAT7+JDK1.7+JNDI+SPRING修改总计

##########################1.去除ejb#######################################################################1.1:导包:javax.xml.rpc-api-1.1.1.jar (复制到路径:webconent/WEB-INF/lib):1.2:从websphere的lib中复制j2ee.jar这个jar包,用压缩软件打开,(注意:j2ee.jar这个包不要放到tomcat下的lib内,tomca

搭建本地yum服务器

在内网环境下,服务器通常不联网,这时候如果要下载什么软件,搭建本地yum服务器的话就很方便了. 创建挂载目录: [[email protected] ~]# mkdir -p /local/yum 2.挂载你的光盘或者U盘到指定目录下,这里的/dev/cdrom可以是你的U盘,具体看你用什么了[[email protected] ~]# mount /dev/cdrom /local/yum 3.copy源yum的目录文件,我做实验需要还原的,这个不是必须 [[email protected]

Hibernate配置文件与映射文件详解

Hibernate是一个彻底的ORM(Object Relational Mapping,对象关系映射)开源框架. 我们先看一下官方文档所给出的,Hibernate 体系结构的高层视图: 其中PO=POJO+映射文件 根据体系结构视图可以了解到整个利用Hibernate框架实现的项目包括整个重要的配置文件: Hibernate配置文件:实现Hibernate基础配置,是Hibernate能够友好的与DB进行交互基础: 开发时放置src目录下,取名为:hibernate.cfg.xml(hiber