3

我对 ssis 事务隔离级别几乎没有疑问。考虑一个场景:我有一个执行 SQL 任务,它在表 A 中插入数据。这个任务指向一个数据流任务,它读取之前插入到 AI 上的数据已经开始分布式事务,如果我在 ssis 中设置事务隔离如已提交,是否首先提交表 A 执行 sql 任务并移动到数据流任务?在这种情况下,其他隔离级别又如何呢?

4

2 回答 2

3

从我从您的问题中可以理解的情况来看,如果您想在数据写入表的同一事务中从表中读取数据,那么适当的事务隔离是什么?据我所知,应该没关系。隔离类型仅解决另一个事务想要修改未提交事务正在修改的相同行的情况。换句话说,只是读取表应该没有问题,您应该会看到来自第一个 Execute SQL 任务的数据。事务中写入的数据在事务提交之前可用。

为了进一步阅读,这是来自 Oracle 文档,但相同的定义应该适用于 SQL 和 SSIS 包。请注意,当两个事务想要修改相同的数据时,它们会处理:

SERIALIZABLE:如果可序列化事务尝试执行 SQL 数据操作语句,该语句修改已被未提交事务修改的任何表,则该语句将失败。

READ COMMITTED:如果一个事务包含需要由另一个事务持有的行锁的 SQL 数据操作语句,则该语句会一直等待,直到行锁被释放。

于 2012-06-13T14:09:51.963 回答
1

不要拒绝这个答案。我从 MSDN 论坛得到它,我把它放在这里以供参考。

http://social.msdn.microsoft.com/Forums/en-US/3dcea5f6-32ef-40aa-90d5-0f2fef9e1d38/isolation-level-in-ssis

一些观察...

SSIS 组件中的 IsolationLevel 属性仅在使用分布式事务时适用(包或其他容器具有 TransactionOption=Required)。所以在这方面,隔离级别在 SSIS 中有点误导。即使您设置了它,除非 SSIS 打开事务,否则它也无济于事。我在这里写了这个限制:http: //msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.runtime.dtscontainer.isolationlevel.aspx

如果您正在自定义从 SSIS 调用的 TSQL 中的隔离级别(存储过程或只是在批处理的开头),您可以覆盖默认的 SQL Server 隔离级别 Read_committed,但是如果您只是指向一个表名数据流源或目标,您不能设置隔离级别。

如果您选择在每个查询中以其他方式手动设置隔离级别,有一些技巧: 1. 如果您要在命令“设置事务隔离级别读取未提交” http://msdn中运行 SET 选项.microsoft.com/en-us/library/ms173763.aspx

小心读取未提交和无锁,因为它可以读取脏数据(通量中的数据更改未完全由其他连接提交。)

  1. 使用锁定提示,例如http://technet.microsoft.com/en-us/library/ms187373.aspx select * from t1 (nolock)

  2. 如果在驱动程序http://msdn.microsoft.com/en-us/library/ms175909.aspx的连接字符串或驱动程序属性中有一个地方可以覆盖它,请在 OLEDB 或 ODBC 中设置自动提交隔离级别'没有测试过,但它可能是可能的。

要查看正在使用的隔离级别,如果您连接的 RDBMS 是 SQL Server 2005/2008,而连接/会话仍处于活动状态,您可以查询 DBCC USEROPTIONS 或从 dm_exec_sessions 中选择

select transaction_isolation_level,* from sys.dm_exec_sessions (0 = Unspecified, 1 = ReadUncomitted, 2 = ReadCommitted, 3 = Repeatable, 4 = Serializable, 5 = Snapshot)

我们还发现快照隔离级别与分布式事务不兼容,因此无法通过 SSIS 属性使用快照隔离级别。一种解决方法是直接在数据源和 ExecuteSqlTask​​ 命令中使用 TSQL 语法进行快照隔离。

祝你好运,Jason 他的 MSDN 个人资料 - http://social.msdn.microsoft.com/profile/jason%20h%20(hdinsight)/?ws=usercard-mini

于 2013-11-09T22:21:37.210 回答