关于ssis转移隔离水平我几乎没有问题。 考虑一个场景:我有一个执行SQL任务,它在表A中插入一个数据。这个任务指向一个数据流任务,它读取先前在AI上插入的数据已启动分布式事务,如果我在ssis中设置事务隔离作为readcommited,它是否在第一次执行sql任务时提交表A并转移到数据流任务? 那么这个场景中的其他隔离级别呢?
答案 0 :(得分:2)
根据您的问题我可以理解,如果您想从同一事务中的表中读取数据并将数据写入表中,那么您会询问什么是适当的事务隔离?据我所知,这应该不重要。隔离类型仅解决另一个事务要修改未提交事务正在修改的相同行的情况。换句话说,只是读取表应该没有问题,您应该看到第一个执行SQL任务中的数据。在事务提交之前,事务中写入的数据可用。
有关进一步阅读,请参阅Oracle文档,但相同的定义应适用于SQL和SSIS包。请注意,当两个事务要修改相同数据时,它们会解决:
SERIALIZABLE:如果可序列化事务尝试执行SQL数据操作语句,该语句修改已由未提交事务修改的任何表,则该语句将失败。
READ COMMITTED:如果事务包含需要由另一个事务持有行锁的SQL数据操作语句,则该语句将一直等到释放行锁。
答案 1 :(得分:0)
不要拒绝这样的答案。我是从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选项“set transaction isolation level read uncommitted”http://msdn.microsoft.com/en-us/library/ms173763.aspx
小心阅读Uncommitted& Nolock,因为它可以读取脏数据(通过其他连接未完全提交的数据变化)。
使用锁定提示,例如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 = ReadUncomitted,2 = ReadCommitted,3 =可重复,4 =可序列化,5 =快照)
我们还发现快照隔离级别与分布式事务不兼容,因此无法通过SSIS属性使用快照隔离级别。解决方法是在数据源和数据源中使用TSQL语法进行快照隔离。直接执行SQLTask命令。
祝你好运,杰森 他的MSDN个人资料 - http://social.msdn.microsoft.com/profile/jason%20h%20(hdinsight)/?ws=usercard-mini