怎样使用SSIS程序包中的事务管理
我试着创建一个SSIS程序包,并且整个包已经封装在一个事务中。另外,有一张表需要在SSIS程序包执行期间保持锁住的状态。您能提供一个如何做到这点的例子吗? 专家解答 嵌入到SSIS 中的事务处理可以很容易地满足你的要求。在我们开始进入到在SSIS中执行事务处理的具体步骤之前,让我们先来讨论事务隔离级别,SSIS中高级别的的事务,接着看看在SSIS包中利用事务去解决自己问题的一个实例。 事务隔离级别 事务隔离级别确定保持锁住状态的持续时间。我们将用SQL Server作为一个例子。以下事务隔离级别可在SQL Server中利用: l 未提交读(READ UNCOMMITTED)- 这些读操作没有获得共享锁,它们也不等待锁。这些一般涉及到脏读,因为你能读没有提交但是已经修改的数据,并且在你读它之后,它可能会回滚。 l 提交读(READ COMMITTED)- 这些读操作获得共享锁,并且等待在事务处理过程中修改的任何数据。 l 重复读(REPEATABLE READ)- 和提交读一样,但此外,在事务处理期间,共享锁保持在行上读。换句话说,被读的任何行不能被其他的连接操作修改,一直到事务提交或者回滚。 l 序列化(SERIALIZABLE)- 跟重复读一样,但此外,如果在执行SELECT查询之后有新的行出现,那么任何其他的连接操作都不能插入行。换句话说,如果你通过序列化隔离级别来执行事务中的一个select语句,那么当你在同一个事务处理中再次执行select语句,你会得到完全相同的结果集。 SQL Server 2005增加了两个新的选项: l 把READ_COMMITTED_SNAPHOT ON设置在数据库级别上的提交读的变化和通过提交读隔离级别的任何事务都不会获得共享锁,也不会等待任何锁。相反,在SELECT语句开始时,你会得到所有行的提交版本。 l 一个命名为SNAPSHOT的新的隔离级别,在它所在的地方把ALLOW_SNAPSHOT_ISOLATION ON设置在数据库级别上,还有把事务隔离级别设置成snapshot的任何事务都不会获得共享锁,也不会等待任何锁。相反,在SELECT语句开始时,你会得到所有行的提交版本。 上述两个SQL Server 2005改进是由在tempdb(参考为version store)中保持行的提交版本而促成的。当一次读操作遇到已经被修改但没有提交的一行,它从version store中重新找回适当的最新提交的行。SQL Server自动执行version store的维护和通过。代码不需要做改动。 SSIS中的事务管理 事务支持内置到SSIS中。TransactionOption属性存在于程序包级别、容器级别(比如For Loop、Foreach Loop和Sequence容器),还有只与任何控制流任务(比如,执行SQL任务,数据流任务等)相关的级别。 l Required – 如果一个事务已经启动,那么容器会加入其中,否则,容器本身会启动一个新的事务。 l Supported – 如果已经存在一个事务,那么容器会加入其中,它本身不会启动一个事务(这是默认情况)。 l NotSupported – 不会加入现有事务中。 SSIS中的内置事务支持利用Microsoft 分布式事务处理协调器(MSDTC)服务,这个服务必须正在运行。MSDTC也允许你执行分布式事务,比如在相同的事务中,更新一个SQL Server数据库和一个Oracle数据库。如果你执行一个使用了内置事务支持的SSIS程序包而MSDTC没有正在运行,那么你会得到如下的错误信息: Error: 0xC001401A at Transaction: The SSIS Runtime has failed 还要注意的是,在默认的序列化隔离级别中,SSIS 程序包内容也包含一个IsolationLevel属性。正如上文关于事务隔离级别的讨论,设置会影响锁的持续时间还有共享锁是否能够获得。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |