【发布时间】:2012-06-11 17:24:45
【问题描述】:
我对 ssis 事务隔离级别有一些疑问。 考虑一个场景:我有一个执行 SQL 任务,它在表 A 中插入数据。这个任务指向一个数据流任务,它读取之前插入到 AI 上的数据已经开始分布式事务,如果我在 ssis 中设置事务隔离如已提交,是否首先提交表 A 执行 sql 任务并移动到数据流任务? 在这种情况下,其他隔离级别呢?
【问题讨论】:
标签: ssis
我对 ssis 事务隔离级别有一些疑问。 考虑一个场景:我有一个执行 SQL 任务,它在表 A 中插入数据。这个任务指向一个数据流任务,它读取之前插入到 AI 上的数据已经开始分布式事务,如果我在 ssis 中设置事务隔离如已提交,是否首先提交表 A 执行 sql 任务并移动到数据流任务? 在这种情况下,其他隔离级别呢?
【问题讨论】:
标签: ssis
从我从您的问题中可以理解的情况来看,如果您想在将数据写入表的同一事务中从表中读取数据,那么适当的事务隔离是什么?据我所知,应该没关系。隔离类型仅解决另一个事务想要修改未提交事务正在修改的相同行的情况。换句话说,只是读取表应该没有问题,您应该会看到来自第一个执行 SQL 任务的数据。事务中写入的数据在事务提交之前可用。
为了进一步阅读,这来自 Oracle 文档,但同样的定义应该适用于 SQL 和 SSIS 包。请注意,当两个事务想要修改相同的数据时,它们会处理:
SERIALIZABLE:如果可序列化事务尝试执行 SQL 数据操作语句,该语句修改已被未提交事务修改的任何表,则该语句将失败。
READ COMMITTED:如果一个事务包含需要由另一个事务持有行锁的 SQL 数据操作语句,则该语句会一直等待,直到行锁被释放。
【讨论】:
不要拒绝这个答案。我从 MSDN 论坛得到它,我把它放在这里以供参考。
一些观察...
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. 如果您要在“设置事务隔离级别读取未提交”命令中运行 SET 选项http://msdn.microsoft.com/en-us/library/ms173763.aspx
小心读取未提交和无锁,因为它可以读取脏数据(其他连接未完全提交的数据变化。)
使用锁定提示,例如 http://technet.microsoft.com/en-us/library/ms187373.aspx select * from t1 (nolock)
在 OLEDB 或 ODBC 中设置自动提交隔离级别,如果在连接字符串或驱动程序属性http://msdn.microsoft.com/en-us/library/ms175909.aspx 中有一个地方可以覆盖它,我还没有测试过,但它可能是可能的.
要查看正在使用的隔离级别,如果您连接的 RDBMS 是 SQL Server 2005/2008,而连接/会话仍处于活动状态,您可以查询 DBCC USEROPTIONS 或从 dm_exec_sessions 中选择
从 sys.dm_exec_sessions 中选择 transaction_isolation_level,* (0 = 未指定,1 = ReadUncommitted,2 = ReadCommitted,3 = 可重复,4 = 可序列化,5 = 快照)
我们还发现快照隔离级别与分布式事务不兼容,因此无法通过 SSIS 属性使用快照隔离级别。一种解决方法是直接在数据源和 ExecuteSqlTask 命令中使用 TSQL 语法进行快照隔离。
祝你好运,杰森 他的 MSDN 个人资料 - http://social.msdn.microsoft.com/profile/jason%20h%20(hdinsight)/?ws=usercard-mini
【讨论】: